unity 一级二级菜单控制脚本,一级菜单按钮为toggle 有多个,控制对应二级菜单父物体显隐,二级菜单父物体下为二级菜单分类父物体,二级菜单分类父物体之下为二级菜单按钮,按钮分toggle和button两类,分别绑定不同方法,关闭二级菜单时对二级菜单按钮做初始化,编写控制脚本并挂载到unity场景,使用MVC框架

时间: 2023-08-07 21:02:50 浏览: 50
首先,我们需要定义菜单的数据模型和视图模型。 ```c# // 菜单项的数据模型 public class MenuItemModel { public string name; // 菜单项名称 public List<MenuItemModel> subItems; // 子菜单项 public bool isToggle; // 是否是 toggle 类型的按钮 } // 菜单的视图模型 public class MenuViewModel { public List<MenuItemModel> items; // 菜单项列表 public int selectedToggleIndex = -1; // 当前选中的 toggle 按钮的索引 public bool isMenuOpen = false; // 是否打开菜单 } ``` 接下来,我们可以编写控制脚本了。 ```c# public class MenuController : MonoBehaviour { private MenuViewModel viewModel; private void Start() { // 初始化视图模型 viewModel = new MenuViewModel(); viewModel.items = new List<MenuItemModel>(); // 添加菜单项 MenuItemModel item1 = new MenuItemModel(); item1.name = "一级菜单1"; item1.isToggle = true; item1.subItems = new List<MenuItemModel>(); item1.subItems.Add(new MenuItemModel() { name = "二级菜单1-1", isToggle = false }); item1.subItems.Add(new MenuItemModel() { name = "二级菜单1-2", isToggle = true }); item1.subItems.Add(new MenuItemModel() { name = "二级菜单1-3", isToggle = true }); viewModel.items.Add(item1); MenuItemModel item2 = new MenuItemModel(); item2.name = "一级菜单2"; item2.isToggle = true; item2.subItems = new List<MenuItemModel>(); item2.subItems.Add(new MenuItemModel() { name = "二级菜单2-1", isToggle = false }); item2.subItems.Add(new MenuItemModel() { name = "二级菜单2-2", isToggle = true }); viewModel.items.Add(item2); // 绑定视图模型到 UI BindViewModel(); } private void BindViewModel() { // 绑定一级菜单项 for (int i = 0; i < viewModel.items.Count; i++) { int index = i; // 闭包,避免 lambda 表达式引用同一个变量 Toggle toggle = transform.Find($"Toggle{index + 1}").GetComponent<Toggle>(); toggle.isOn = false; toggle.onValueChanged.AddListener((value) => { OnToggleValueChanged(index, value); }); } // 绑定二级菜单项 for (int i = 0; i < viewModel.items.Count; i++) { Transform parent = transform.Find($"Submenu{ i + 1 }"); for (int j = 0; j < viewModel.items[i].subItems.Count; j++) { int subIndex = j; Transform child = parent.Find($"Submenu{ i + 1 }-Item{ j + 1 }"); if (viewModel.items[i].subItems[j].isToggle) { Toggle toggle = child.GetComponent<Toggle>(); toggle.isOn = false; toggle.onValueChanged.AddListener((value) => { OnSubToggleValueChanged(i, subIndex, value); }); } else { Button button = child.GetComponent<Button>(); button.onClick.AddListener(() => { OnSubButtonClick(i, subIndex); }); } } } // 绑定关闭菜单按钮 Button closeButton = transform.Find("CloseButton").GetComponent<Button>(); closeButton.onClick.AddListener(() => { OnCloseButtonClick(); }); } private void OnToggleValueChanged(int index, bool value) { if (value) { // 关闭其他的 toggle for (int i = 0; i < viewModel.items.Count; i++) { if (i != index) { Toggle toggle = transform.Find($"Toggle{ i + 1 }").GetComponent<Toggle>(); toggle.isOn = false; } } // 更新选中的 toggle 索引 viewModel.selectedToggleIndex = index; // 显示对应的二级菜单 ShowSubmenu(index); } else { // 隐藏当前的二级菜单 HideSubmenu(index); } } private void OnSubToggleValueChanged(int index, int subIndex, bool value) { // do something } private void OnSubButtonClick(int index, int subIndex) { // do something } private void OnCloseButtonClick() { // 关闭菜单 viewModel.isMenuOpen = false; // 隐藏所有的二级菜单 for (int i = 0; i < viewModel.items.Count; i++) { HideSubmenu(i); } } private void ShowSubmenu(int index) { Transform submenu = transform.Find($"Submenu{ index + 1 }"); submenu.gameObject.SetActive(true); } private void HideSubmenu(int index) { Transform submenu = transform.Find($"Submenu{ index + 1 }"); submenu.gameObject.SetActive(false); } } ``` 最后,我们需要在 UI 中添加对应的组件。以一级菜单为例,我们可以在 Canvas 中添加多个 Toggle 组件,并将它们的 GameObject 名称分别设置为 "Toggle1"、"Toggle2" 等。在每个 Toggle 的子对象中添加一个 Text 组件,用于显示菜单项的名称。接着,我们需要添加二级菜单的父物体,并将它们的 GameObject 名称分别设置为 "Submenu1"、"Submenu2" 等。在每个二级菜单的父物体下添加多个 Toggle 或 Button 组件,用于显示二级菜单项的名称。在关闭菜单的按钮下添加一个 Button 组件,并将它的 GameObject 名称设置为 "CloseButton"。

相关推荐

最新推荐

recommend-type

Unity3D实现虚拟按钮控制人物移动效果

主要为大家详细介绍了Unity3D实现虚拟按钮控制人物移动效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
recommend-type

Unity实现QQ列表折叠菜单

主要为大家详细介绍了Unity实现QQ列表折叠菜单,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
recommend-type

Unity绘制二维动态曲线

主要为大家详细介绍了Unity绘制二维动态曲线,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
recommend-type

Unity控制指针旋转到指定位置

主要为大家详细介绍了Unity控制指针旋转到指定位置,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
recommend-type

Unity3D实现鼠标控制旋转转盘

主要为大家详细介绍了Unity3D实现鼠标控制旋转转盘,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

MATLAB柱状图在信号处理中的应用:可视化信号特征和频谱分析

![matlab画柱状图](https://img-blog.csdnimg.cn/3f32348f1c9c4481a6f5931993732f97.png) # 1. MATLAB柱状图概述** MATLAB柱状图是一种图形化工具,用于可视化数据中不同类别或组的分布情况。它通过绘制垂直条形来表示每个类别或组中的数据值。柱状图在信号处理中广泛用于可视化信号特征和进行频谱分析。 柱状图的优点在于其简单易懂,能够直观地展示数据分布。在信号处理中,柱状图可以帮助工程师识别信号中的模式、趋势和异常情况,从而为信号分析和处理提供有价值的见解。 # 2. 柱状图在信号处理中的应用 柱状图在信号处理
recommend-type

用Spring boot和vue写一个登录注册界面

好的,这是一个比较常见的技术问题,我可以为您提供一些参考资料和思路。首先,您可以使用Spring Boot作为后端框架来处理用户认证和注册的逻辑,比如使用Spring Security实现用户登录认证。同时,您还需要设计相应的数据模型和数据库表结构来存储用户信息。在前端方面,您可以使用Vue.js作为框架来构建登录注册页面,使用Axios来发起API请求并和后端进行交互。当然,在实现过程中,还需要考虑一些具体细节,比如数据校验、安全性和用户体验等方面。希望这些信息能够帮助到您。
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。