unity 一级二级菜单控制脚本,一级菜单按钮为toggle 有多个,控制对应二级菜单父物体显隐,二级菜单父物体下为二级菜单分类父物体,二级菜单分类父物体之下为二级菜单按钮,按钮分toggle和button两类,分别绑定不同方法,关闭二级菜单时对二级菜单按钮做初始化,编写控制脚本并挂载到unity场景,使用MVC框架
时间: 2023-08-07 20:01:59 浏览: 74
一级菜单调用二级菜单
首先,我们需要定义一个 Model 类,用来记录菜单状态:
```
public class MenuModel {
public bool[] firstLevelMenuStatus; // 一级菜单状态
public bool[][] secondLevelMenuStatus; // 二级菜单状态
public MenuModel(int firstLevelMenuCount, int[] secondLevelMenuCounts) {
firstLevelMenuStatus = new bool[firstLevelMenuCount];
secondLevelMenuStatus = new bool[firstLevelMenuCount][];
for (int i = 0; i < firstLevelMenuCount; i++) {
secondLevelMenuStatus[i] = new bool[secondLevelMenuCounts[i]];
}
}
}
```
接着,我们定义一个 View 类,用来控制菜单的显示和隐藏:
```
public class MenuView : MonoBehaviour {
public GameObject[] firstLevelMenus; // 一级菜单按钮
public GameObject[][] secondLevelMenus; // 二级菜单按钮
public void ShowFirstLevelMenu(int index) {
firstLevelMenus[index].SetActive(true);
}
public void HideFirstLevelMenu(int index) {
firstLevelMenus[index].SetActive(false);
}
public void ShowSecondLevelMenu(int first, int second) {
secondLevelMenus[first][second].SetActive(true);
}
public void HideSecondLevelMenu(int first, int second) {
secondLevelMenus[first][second].SetActive(false);
}
}
```
最后,我们定义一个 Controller 类,用来控制菜单的行为:
```
public class MenuController : MonoBehaviour {
public MenuModel model;
public MenuView view;
void Start() {
// 初始化 Model
model = new MenuModel(3, new int[] { 3, 2, 4 });
// 初始化 View
view.firstLevelMenus = new GameObject[3];
view.firstLevelMenus[0] = transform.Find("Menu1").gameObject;
view.firstLevelMenus[1] = transform.Find("Menu2").gameObject;
view.firstLevelMenus[2] = transform.Find("Menu3").gameObject;
view.secondLevelMenus = new GameObject[3][];
view.secondLevelMenus[0] = new GameObject[3];
view.secondLevelMenus[0][0] = transform.Find("Menu1/Menu1-1").gameObject;
view.secondLevelMenus[0][1] = transform.Find("Menu1/Menu1-2").gameObject;
view.secondLevelMenus[0][2] = transform.Find("Menu1/Menu1-3").gameObject;
view.secondLevelMenus[1] = new GameObject[2];
view.secondLevelMenus[1][0] = transform.Find("Menu2/Menu2-1").gameObject;
view.secondLevelMenus[1][1] = transform.Find("Menu2/Menu2-2").gameObject;
view.secondLevelMenus[2] = new GameObject[4];
view.secondLevelMenus[2][0] = transform.Find("Menu3/Menu3-1").gameObject;
view.secondLevelMenus[2][1] = transform.Find("Menu3/Menu3-2").gameObject;
view.secondLevelMenus[2][2] = transform.Find("Menu3/Menu3-3").gameObject;
view.secondLevelMenus[2][3] = transform.Find("Menu3/Menu3-4").gameObject;
// 初始化菜单状态
for (int i = 0; i < 3; i++) {
view.HideFirstLevelMenu(i);
for (int j = 0; j < model.secondLevelMenuStatus[i].Length; j++) {
view.HideSecondLevelMenu(i, j);
}
}
}
public void OnFirstLevelMenuToggleValueChanged(int index) {
if (model.firstLevelMenuStatus[index]) {
model.firstLevelMenuStatus[index] = false;
view.HideFirstLevelMenu(index);
for (int i = 0; i < model.secondLevelMenuStatus[index].Length; i++) {
model.secondLevelMenuStatus[index][i] = false;
view.HideSecondLevelMenu(index, i);
}
} else {
model.firstLevelMenuStatus[index] = true;
view.ShowFirstLevelMenu(index);
}
}
public void OnSecondLevelMenuToggleValueChanged(int first, int second) {
for (int i = 0; i < model.secondLevelMenuStatus[first].Length; i++) {
if (i != second) {
model.secondLevelMenuStatus[first][i] = false;
view.HideSecondLevelMenu(first, i);
}
}
if (model.secondLevelMenuStatus[first][second]) {
model.secondLevelMenuStatus[first][second] = false;
view.HideSecondLevelMenu(first, second);
} else {
model.secondLevelMenuStatus[first][second] = true;
view.ShowSecondLevelMenu(first, second);
}
}
public void OnSecondLevelMenuButtonClick(int first, int second) {
// TODO: 处理二级菜单按钮的点击事件
}
}
```
在 Unity 中,我们需要将这个 Controller 挂载到场景中的一个 GameObject 上,并将 View 中的所有 GameObject 都绑定到对应的变量上。接着,我们需要在一级菜单的 Toggle 组件的 OnValueChanged 事件和二级菜单的 Toggle 和 Button 组件的 OnClick 事件中调用对应的方法。这样,我们就完成了菜单的控制脚本,并且使用了 MVC 框架。
阅读全文