//得到所有的父节点 public static Stack <Transform> GetAllParentNode(Transform go, Transform endTransform = null, bool isContainEnd = true) { Stack <Transform> parentTransforms = new Stack <Transform>(); if (MNullHelper.IsNull(go)) { return(parentTransforms); } for (; ;) { go = go.parent; if (go == null) { return(parentTransforms); } if (go == endTransform) { if (isContainEnd) { parentTransforms.Push(go); } return(parentTransforms); } parentTransforms.Push(go); } }
//如果给定的物体是空的则创建物体 public static void CreateGameObjectIfNull(ref GameObject data, GameObject prefab, Transform parent, Action finishCreateMethod = null) { if (MNullHelper.IsNull(data)) { data = CreateGameObject(prefab, parent); if (finishCreateMethod != null) { finishCreateMethod(); } } }
public static void CreateGameObjectIfNull <T>(ref T data, T prefab, Transform parent, Action finishCreateMethod = null) where T : MonoBehaviour { if (MNullHelper.IsNull(data)) { data = CreateGameObject(prefab, parent); if (finishCreateMethod != null) { finishCreateMethod(); } } }
//引用是否失效 public static bool IsInvalid(WeakReference reference) { if (reference.IsAlive == false) { return(true); } if (MNullHelper.IsNull(reference.Target)) { return(true); } return(false); }
public static void SafeSetParent(Transform child, Transform parent) { if (MNullHelper.IsNull(child) || MNullHelper.IsNull(parent)) { return; } if (!child.IsChildOf(parent)) { child.SetParent(parent, false); } }
//查找子物体 //此方法支持物体名称查找、全部或部分路径查找 //查找方式为:先序遍历物体树状结构,返回找到的第一个 public static Transform FindChildrenTransformRecursion(Transform root, string targetName) { Transform targetTransform; targetTransform = root.Find(targetName); if (MNullHelper.IsNull(targetTransform)) { for (int i = 0; i < root.childCount; i++) { Transform child = root.GetChild(i); targetTransform = FindChildrenTransformRecursion(child, targetName); if (!MNullHelper.IsNull(targetTransform)) { break; } } } return(targetTransform); }
//查找所有名字相同的子物体 //此查找方法比较消耗性能 //此方法只支持物体名称查找,不支持路径查找 public static List <Transform> FindChildrenTransformsRecursion(Transform root, string targetName) { List <Transform> targetTransforms = new List <Transform>(); if (!MNullHelper.IsNull(root) && !string.IsNullOrEmpty(targetName)) { Transform child; for (int i = 0; i < root.childCount; i++) { child = root.GetChild(i); if (child.name == targetName) { targetTransforms.Add(child); } targetTransforms.AddRange(FindChildrenTransformsRecursion(child, targetName)); } } return(targetTransforms); }
//得到物体在场景中的路径 public static string GetGameObjectPath(Transform transform, Transform endTransform = null, bool isContainEnd = true) { if (MNullHelper.IsNull(transform)) { return(""); } Stack <Transform> paths = GetAllParentNode(transform, endTransform, isContainEnd); var path = MSharedStringBuilderManager.Get(); int pathsCount = paths.Count; for (int i = 0; i < pathsCount; i++) { Transform go = paths.Pop(); path.Append(go.name); path.Append('/'); } path.Append(transform.name); return(path.ToString()); }