针对Unity3D利用VerticalLayoutGroup组件制作(折叠菜单、树状菜单) 这篇文章做了部分改进,其实这种方式的移植性和扩展性还是挺高的 相比插件要好的多,而且作者本身也不喜欢用插件。
下边针对上篇文章添加了一点小小的功能,先看效果图。
新加的白色目录部分,这就是真正的菜单了,灰色的只是表示目录的集合。下边来看代码。
首先需要在数据存储类中添加保存菜单的字段
然后修改数据获取的代码
然后创建一个配置文件
然后修改创建代码
#region 创建当前菜单下的节点
if (data[i].Data.Count>0|| data[i].Menus.Count>0)
{
GameObject group = new GameObject(data[i].MenuName+ "_Group");
menuClick.Group = group;
group.transform.SetParent(parnt);
group.transform.localScale = Vector3.one;
group.AddComponent<RectTransform>().sizeDelta = new Vector2(400, 0);
VerticalLayoutGroup layoutGroup = group.AddComponent<VerticalLayoutGroup>();
layoutGroup.padding.left = 50;
//group.padding.top = (int)a.GetComponent<RectTransform>().sizeDelta.y;
layoutGroup.spacing = 10f;
layoutGroup.childControlHeight = false;
layoutGroup.childControlWidth = false;
group.AddComponent<ContentSizeFitter>().verticalFit = ContentSizeFitter.FitMode.PreferredSize;
if (data[i].Data.Count > 0)
CreateNode(group.transform, data[i].Data);
for (int j = 0; j < data[i].Menus.Count; j++)
{
GameObject menu1 = new GameObject(data[i].Menus[j]);
Image image1 = menu1.AddComponent<Image>();
image1.color =Color.white;
menu1.transform.SetParent(group.transform);
menu1.transform.localScale = Vector3.one;
menu1.GetComponent<RectTransform>().sizeDelta = new Vector2(400, 50);
string _name = data[i].Menus[j];
menu1.AddComponent<Button>().onClick.AddListener(()=> { MenuClick(_name); }) ;
GameObject label1 = new GameObject(data[i].Menus[j]);
label1.transform.SetParent(menu1.transform);
label1.transform.localScale = Vector3.one;
Text text1 = label1.AddComponent<Text>();
text1.font = font;
text1.text = data[i].Menus[j];
text1.fontSize = 26;
text1.fontStyle = FontStyle.Normal;
text1.alignment = TextAnchor.MiddleCenter;
text1.horizontalOverflow = HorizontalWrapMode.Overflow;
text1.color = Color.black;
RectTransform rect1 = label.GetComponent<RectTransform>();
rect1.sizeDelta = new Vector2(400, 50);
}
group.SetActive(IsUnfold);
identifying.SetActive(true);
menuClick.RefreshIdentifying();
LayoutRebuilder.ForceRebuildLayoutImmediate(group.GetComponent<RectTransform>());
}
#endregion
TreeMenuCheckBox 脚本添加一个方法;
public void MenuClick(string name)
{
Debug.Log("[点击菜单]-"+name);
}
搞定。