using System.Collections; using System.Collections.Generic; using UnityEngine; namespace XericLibrary.Runtime.MacroLibrary { public static class MacroObject { #region 对象操作 /// /// 获取一个变换节点下所有的子成员 /// /// /// public static IEnumerable GetChildren(this Transform trans) { for(int i = 0; i < trans.childCount; i++) { yield return trans.GetChild(i); } } /// /// 在所有子成员中深度优先找到第一个组件 /// /// /// /// 遍历深度,0表示仅在此处寻找,1表示在包含下一级在内的所有成员中寻找 /// public static IEnumerable GetChildrenRecursionComponents(this Transform trans, int recursion = 1) where T : Component { int newRecursion = recursion - 1; foreach(var item in trans.GetChildren()) { var comp = item.GetComponent(); if(comp == null && newRecursion > 0) comp = item.GetChildrenRecursionComponent(newRecursion); yield return comp; } } /// /// 按深度优先寻找一个组件 /// /// /// /// 遍历深度,0表示仅在第一子集中寻找,1表示在包含下一级在内的所有成员中寻找 /// public static T GetChildrenRecursionComponent(this Transform trans, int depth = 1) where T : Component { T result; int newDepth = depth - 1; #if true // 如果不知道这里在找什么的可以打开调试看看 foreach(var item in trans.GetChildren()) { result = item.GetComponent(); if(result == null && newDepth > 0) result = item.GetChildrenRecursionComponent(newDepth); if(result != null) return result; } #else string info = $"{depth}. 开始在{trans.name}中寻找\r\n"; foreach(var item in trans.GetChildren()) { info += $"{depth}. > 正在{item.name}中寻找\r\n"; result = item.GetComponent(); info += $"{depth}. 当前节点{(result == null ? "不包含组件":"包含组件")}\r\n"; if(result == null && newDepth >= 0) { info += $"{depth}. 前往深层寻找 > \r\n"; result = item.GetRecursionComponent(newDepth); info += $"{depth}. 深层查找返回 < \r\n"; } if(result != null) { info += $"{depth}. 已找到结果:{result.name} \r\n"; Debug.Log(info); return result; } info += $"{depth}. 没有找到任何东西 \r\n"; } Debug.Log(info + "没有找到,空结束"); #endif return null; } /// /// 无论如何都要获取一个组件 /// /// /// public static T GetComponentAnyway(this GameObject obj) where T : Component { var component = obj.GetComponent(); if(component is null) component = obj.AddComponent(); return component; } /// /// 无论如何都要获取一个对象 /// /// /// /// public static T GetObjectAnyway(this T obj) where T : new() { if(obj is null) obj = new T(); return obj; } #endregion } }