From ca82f68f3737af2f542c70fd574f1f468c59b4f3 Mon Sep 17 00:00:00 2001 From: shenjianxing <”315615051@qq.com“> Date: Wed, 19 Feb 2025 09:48:26 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E5=96=84=E8=8F=9C=E5=8D=95=E5=8A=9F?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Assets/Scripts/UI/UIBody3DMenuTree.cs | 119 ++++++++++++++++++++------ 1 file changed, 94 insertions(+), 25 deletions(-) diff --git a/Assets/Scripts/UI/UIBody3DMenuTree.cs b/Assets/Scripts/UI/UIBody3DMenuTree.cs index 6b88573d..6397742e 100644 --- a/Assets/Scripts/UI/UIBody3DMenuTree.cs +++ b/Assets/Scripts/UI/UIBody3DMenuTree.cs @@ -3,6 +3,7 @@ using UnityEngine.UI; using XMLTool; using System.Collections.Generic; using TMPro; +using UnityEditor.Hardware; namespace QFramework.Example { @@ -48,7 +49,7 @@ namespace QFramework.Example switch (status) { case ObjToggleStatus.None: - Utility.FindObj(body.Path).gameObject.SetActive(false); + CheckActive(); foreach (var sub in body.subBody) { if (objBtnDataMap.ContainsKey(sub.Value)) @@ -56,11 +57,14 @@ namespace QFramework.Example objBtnDataMap[sub.Value].SetStatus(status); } } + SetUpStatus(body, true); break; case ObjToggleStatus.Half: + CheckActive(); + SetUpStatus(body, false); break; case ObjToggleStatus.Full: - Utility.FindObj(body.Path).gameObject.SetActive(true); + CheckActive(); foreach (var sub in body.subBody) { if (objBtnDataMap.ContainsKey(sub.Value)) @@ -68,35 +72,100 @@ namespace QFramework.Example objBtnDataMap[sub.Value].SetStatus(status); } } + SetUpStatus(body, true); break; } - - - SetUpStatus(body.parent); - RefreshUI(); } - public void SetUpStatus(Body3D.Body body) + public void CheckActive() { - //if (body != null) - //{ - // foreach (var sub in body.subBody) - // { - // if (objBtnDataMap.ContainsKey(sub.Value)) - // { - // objBtnDataMap[sub.Value] - // } - // } - //} - //if (objBtnDataMap.ContainsKey(body)) - //{ - // objBtnDataMap[body].SetStatus(this.status); - //} - //if (body.parent != null) - //{ - // SetUpStatus(body.parent); - //} + switch (status) + { + case ObjToggleStatus.None: + Utility.FindObj(body.Path).SetActive(false); + break; + case ObjToggleStatus.Half: + case ObjToggleStatus.Full: + Utility.FindObj(body.Path).SetActive(true); + break; + } + } + + + public void RefreshParent(ObjToggleStatus status) + { + this.status = status; + CheckActive(); + RefreshUI(); + } + + public void SetUpStatus(Body3D.Body body, bool needCheck) + { + var parent = body.parent; + if (parent != null && objBtnDataMap.ContainsKey(parent)) + { + if (needCheck) + { + bool allOn = true; + bool allNone = true; + + // 遍历 body 的子元素 subBody + foreach (var sub in parent.subBody) + { + // 检查 objBtnDataMap 中是否包含当前子元素的值 + if (objBtnDataMap.ContainsKey(sub.Value)) + { + // 获取当前子元素对应的按钮数据的状态 + var status = objBtnDataMap[sub.Value].status; + // 如果当前子元素的状态不是 Full,说明不是所有子元素都是 Full 状态 + if (status != ObjToggleStatus.Full) + { + allOn = false; + } + // 如果当前子元素的状态不是 None,说明不是所有子元素都是 None 状态 + if (status != ObjToggleStatus.None) + { + allNone = false; + } + } + else + { + // 如果 objBtnDataMap 中不包含当前子元素的值,说明不是所有状态都符合要求 + allOn = false; + allNone = false; + break; + } + } + + // 如果所有子元素的状态都是 Full + if (allOn) + { + // 将当前 body 的状态设置为 Full + objBtnDataMap[parent].RefreshParent(ObjToggleStatus.Full); + } + // 如果所有子元素的状态都是 None + else if (allNone) + { + // 将当前 body 的状态设置为 None + objBtnDataMap[parent].RefreshParent(ObjToggleStatus.None); + } + else + { + objBtnDataMap[parent].RefreshParent(ObjToggleStatus.Half); + } + SetUpStatus(parent, true); + } + else + { + if (objBtnDataMap.ContainsKey(parent)) + { + objBtnDataMap[parent].SetStatus(ObjToggleStatus.Half); + SetUpStatus(parent, false); + } + } + } + }