unity 一级二级菜单控制脚本,一级菜单点击控制对应二级菜单父物体显隐,二级菜单对应单独方法,使用MVC框架
时间: 2023-08-03 21:03:57 浏览: 91
以下是一个简单的Unity一级二级菜单控制脚本,其中包含了MVC框架的思想:
```
using UnityEngine;
public class MenuController : MonoBehaviour
{
// 一级菜单对象
public GameObject primaryMenu;
// 二级菜单对象
public GameObject[] secondaryMenus;
// 当前选中的二级菜单索引
private int selectedSecondaryMenuIndex = -1;
// 控制器
private MenuModel model;
private MenuView view;
private void Awake()
{
// 初始化MVC组件
model = new MenuModel();
view = new MenuView(primaryMenu, secondaryMenus);
}
private void Start()
{
// 注册一级菜单点击事件
view.PrimaryMenuButtonClicked += OnPrimaryMenuButtonClicked;
// 注册二级菜单点击事件
for (int i = 0; i < secondaryMenus.Length; i++)
{
view.SecondaryMenuButtonClicked[i] += () => OnSecondaryMenuButtonClicked(i);
}
// 初始化二级菜单显隐
HideAllSecondaryMenus();
}
// 一级菜单点击事件处理
private void OnPrimaryMenuButtonClicked()
{
// 切换一级菜单显隐
view.TogglePrimaryMenu();
// 隐藏所有二级菜单
HideAllSecondaryMenus();
// 清除选中的二级菜单索引
selectedSecondaryMenuIndex = -1;
}
// 二级菜单点击事件处理
private void OnSecondaryMenuButtonClicked(int index)
{
// 如果点击的是已选中的二级菜单,则隐藏该菜单
if (selectedSecondaryMenuIndex == index)
{
view.HideSecondaryMenu(index);
selectedSecondaryMenuIndex = -1;
}
else
{
// 显示选中的二级菜单,并隐藏其他二级菜单
ShowSecondaryMenu(index);
}
}
// 显示选中的二级菜单,并隐藏其他二级菜单
private void ShowSecondaryMenu(int index)
{
// 隐藏所有二级菜单
HideAllSecondaryMenus();
// 显示选中的二级菜单
view.ShowSecondaryMenu(index);
// 保存选中的二级菜单索引
selectedSecondaryMenuIndex = index;
}
// 隐藏所有二级菜单
private void HideAllSecondaryMenus()
{
for (int i = 0; i < secondaryMenus.Length; i++)
{
view.HideSecondaryMenu(i);
}
}
}
// 模型
public class MenuModel
{
// 可以在此添加数据和方法
}
// 视图
public class MenuView
{
// 一级菜单对象
private GameObject primaryMenu;
// 二级菜单对象数组
private GameObject[] secondaryMenus;
// 一级菜单点击事件
public event System.Action PrimaryMenuButtonClicked;
// 二级菜单点击事件数组
public event System.Action[] SecondaryMenuButtonClicked;
public MenuView(GameObject primaryMenu, GameObject[] secondaryMenus)
{
this.primaryMenu = primaryMenu;
this.secondaryMenus = secondaryMenus;
// 初始化菜单显隐
primaryMenu.SetActive(false);
for (int i = 0; i < secondaryMenus.Length; i++)
{
secondaryMenus[i].SetActive(false);
}
// 绑定一级菜单点击事件
var primaryButton = primaryMenu.GetComponent<Button>();
if (primaryButton != null)
{
primaryButton.onClick.AddListener(() => PrimaryMenuButtonClicked?.Invoke());
}
// 绑定二级菜单点击事件
SecondaryMenuButtonClicked = new System.Action[secondaryMenus.Length];
for (int i = 0; i < secondaryMenus.Length; i++)
{
var secondaryButton = secondaryMenus[i].GetComponent<Button>();
if (secondaryButton != null)
{
int index = i;
secondaryButton.onClick.AddListener(() => SecondaryMenuButtonClicked[index]?.Invoke());
}
}
}
// 切换一级菜单显隐
public void TogglePrimaryMenu()
{
primaryMenu.SetActive(!primaryMenu.activeSelf);
}
// 显示指定索引的二级菜单
public void ShowSecondaryMenu(int index)
{
if (index >= 0 && index < secondaryMenus.Length)
{
secondaryMenus[index].SetActive(true);
}
}
// 隐藏指定索引的二级菜单
public void HideSecondaryMenu(int index)
{
if (index >= 0 && index < secondaryMenus.Length)
{
secondaryMenus[index].SetActive(false);
}
}
}
```
这个脚本实现了以下功能:
- 一级菜单点击控制对应二级菜单父物体显隐
- 二级菜单对应单独方法
- 使用MVC框架
其中,模型(MenuModel)可以用来存储数据和方法,视图(MenuView)用来控制UI元素的显隐和响应事件,控制器(MenuController)则负责协调模型和视图的交互,并处理业务逻辑。这种架构可以帮助我们更好地组织代码,使得代码更易于维护和扩展。
阅读全文