using UnityEngine;
using UnityEngine.UI;
using XMLTool;
using System.Collections.Generic;
using TMPro;
namespace QFramework.Example
{
public class UIBody3DMenuTreeData : UIPanelData
{
public Body3D.Body body;
}
public partial class UIBody3DMenuTree : UIPanel
{
///
/// 搜索结果按钮与菜单按钮的对应
///
Dictionary searchItemMap = new Dictionary();
protected override void OnInit(IUIData uiData = null)
{
// please add init code here
Close.onClick.AddListener(() =>
{
Hide();
UIKit.OpenPanelAsync().ToAction().StartGlobal();
});
Input.onSelect.AddListener(str =>
{
Debug.LogError("onSelect:" + str);
SearchContent.gameObject.SetActive(true);
Content.gameObject.SetActive(false);
});
Input.onEndEdit.AddListener(str =>
{
Debug.LogError("onEndEdit:" + str);
if (string.IsNullOrEmpty(str))
{
SearchContent.gameObject.SetActive(false);
Content.gameObject.SetActive(true);
SearchContent.RemoveAllChildren();
}
else
{
SearchContent.gameObject.SetActive(true);
Content.gameObject.SetActive(false);
RefreshSearchContent(str);
}
});
}
protected override void OnOpen(IUIData uiData = null)
{
mData = uiData as UIBody3DMenuTreeData ?? new UIBody3DMenuTreeData();
Content.RemoveAllChildren();
BuildTreeUI(mData.body);
}
private void BuildTreeUI(Body3D.Body data, int depth = 0, Transform parent = null)
{
foreach (var bodyPair in data.subBody)
{
Body3D.Body body = bodyPair.Value;
// 确定父容器
Transform targetParent = parent != null ? parent : Content;
// 创建Toggle
GameObject toggleObj = GameObject.Instantiate(Item.gameObject, targetParent);
toggleObj.name = body.Name;
Toggle uiToggle = toggleObj.transform.Find("ToggleContent/UI").GetComponent();
Toggle objToggle = toggleObj.transform.Find("ToggleContent/Obj").GetComponent();
TextMeshProUGUI label = toggleObj.transform.Find("ToggleContent/Label").GetComponentInChildren();
label.text = body.Name; // 根据深度添加缩进
toggleObj.transform.Find("ToggleContent").GetComponent().padding = new RectOffset(depth * 15, 5, 2, 2);
if (depth != 0)
{
toggleObj.SetActive(false);
}
// 递归构建子节点
Transform subContent = toggleObj.transform.Find("SubContent");
// 设置Toggle的监听事件
uiToggle.onValueChanged.AddListener((isOn) =>
{
for (int i = 0; i < subContent.childCount; i++)
{
subContent.GetChild(i).gameObject.SetActive(isOn);
}
});
// 为objToggle添加点击事件处理逻辑
objToggle.onValueChanged.AddListener((isOn) =>
{
SetObjectVisibility(body, isOn, subContent);
});
if (body.subBody.Count > 0)
{
uiToggle.gameObject.SetActive(true);
BuildTreeUI(body, depth + 1, subContent);
//HideSubBody(body); // 初始时隐藏子节点
}
else
{
uiToggle.gameObject.SetActive(false);
Debug.Log($"节点 {body.Name} 没有子节点。");
}
}
}
// 根据body和subbody中的path设置物体的显隐,同时设置子UI中的objToggle状态
private void SetObjectVisibility(Body3D.Body body, bool isOn, Transform subContent)
{
// 处理当前body的path对应的物体
GameObject targetObj = Utility.FindObj(body.Path);
if (targetObj != null)
{
targetObj.SetActive(isOn);
}
// 递归处理subbody中的path对应的物体,并设置子UI中的objToggle状态
int index = 0;
foreach (var subBodyPair in body.subBody)
{
Body3D.Body subBody = subBodyPair.Value;
if (subContent.childCount > index)
{
Transform childToggleObj = subContent.GetChild(index);
Toggle childObjToggle = childToggleObj.transform.Find("ToggleContent/Obj").GetComponent();
childObjToggle.isOn = isOn; // 设置子UI中的objToggle状态
Transform childSubContent = childToggleObj.transform.Find("SubContent");
SetObjectVisibility(subBody, isOn, childSubContent);
}
index++;
}
}
// 实现RefreshSearchContent函数
private void RefreshSearchContent(string str)
{
// 清空SearchContent下的所有子物体
searchItemMap.Clear();
SearchContent.RemoveAllChildren();
// 递归检查子物体的子物体
CheckChildren(Content, str);
}
// 递归检查子物体的子物体
private void CheckChildren(Transform parent, string str)
{
// 遍历当前父物体下的所有子物体
for (int i = 0; i < parent.childCount; i++)
{
Transform child = parent.GetChild(i);
// 尝试查找 ToggleContent/Label 组件
Transform labelTransform = child.Find("ToggleContent/Label");
if (labelTransform != null)
{
TextMeshProUGUI textComponent = labelTransform.GetComponent();
if (textComponent != null)
{
string name = textComponent.text;
// 检查子物体的名字是否包含搜索字符串
if (name.Contains(str))
{
// 复制该子物体到 SearchContent 中
GameObject clone = GameObject.Instantiate(SearchItem.gameObject, SearchContent);
searchItemMap.Add(clone, child.gameObject);
Transform subContent = child.Find("SubContent");
// 检查是否有子内容
if (subContent.childCount > 0)
{
Button btn = clone.transform.Find("Button").GetComponent