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
}
}