unity 一级二级菜单控制脚本,一级菜单按钮为toggle 有多个,控制对应二级菜单父物体显隐,二级菜单误操作并挂载到unity场景,使用MVC框架
时间: 2023-08-07 19:05:16 浏览: 132
以下是一个简单的实现,使用了MVC框架:
首先创建一个Model类,用于保存菜单项的状态信息:
```csharp
public class MenuItemModel
{
public bool isOn { get; set; } // 是否选中
public GameObject subMenu { get; set; } // 对应的二级菜单
}
```
然后创建一个Controller类,用于处理用户的输入和更新Model:
```csharp
public class MenuItemController
{
private List<MenuItemModel> models; // 所有菜单项的Model
public MenuItemController(List<MenuItemModel> models)
{
this.models = models;
}
public void OnToggleValueChanged(int index, bool isOn)
{
models[index].isOn = isOn;
models[index].subMenu.SetActive(isOn);
}
}
```
最后创建一个View类,用于显示菜单项的UI,并将用户的操作通过Controller传递给Model:
```csharp
public class MenuItemView : MonoBehaviour
{
public Toggle[] toggles; // 一级菜单的Toggle数组
public GameObject[] subMenus; // 二级菜单的GameObject数组
private List<MenuItemModel> models; // 所有菜单项的Model
private MenuItemController controller; // 控制器
void Start()
{
models = new List<MenuItemModel>();
for (int i = 0; i < toggles.Length; i++)
{
MenuItemModel model = new MenuItemModel();
model.isOn = toggles[i].isOn;
model.subMenu = subMenus[i];
models.Add(model);
int index = i; // 记录当前循环的索引,以便在事件回调中使用
toggles[i].onValueChanged.AddListener((isOn) =>
{
controller.OnToggleValueChanged(index, isOn);
});
}
controller = new MenuItemController(models);
}
}
```
这样就完成了一个简单的一级二级菜单控制脚本。当用户在一级菜单中切换Toggle时,会触发相应的事件回调,Controller会根据当前的状态更新对应的Model,并将状态同步到二级菜单的GameObject上。注意,这里的View和Controller都是针对整个菜单的,如果需要复用该组件,可以将Model和Controller分离出来,作为单独的类使用。
阅读全文