TransformExpand.cs
1. 深度遍历 某物体子物体,返回第一个名字为goName的组件
/// <typeparam name="T"></typeparam>
/// <param name="trans"></param>
/// <param name="goName"></param>
/// <returns></returns>
public static T FindFromAllChild<T>(this Transform trans, string goName) where T : UnityEngine.Object
{
Transform child = trans.Find(goName);
if (child != null)
{
return child.GetComponent<T>();
}
Transform go = null;
for (int i = 0; i < trans.childCount; i++)
{
child = trans.GetChild(i);
go = FindFromAllChild<Transform>(child, goName);
if (go != null)
{
return go.GetComponent<T>();
}
}
return null;
}
2. 深度遍历 某物体子物体,返回第一个层级为Layer的组件
/// <typeparam name="T"></typeparam>
/// <param name="trans"></param>
/// <param name="goName"></param>
/// <returns></returns>
public static T FindFromAllChild<T>(this Transform trans, LayerMask layer) where T : UnityEngine.Object
{
Transform child = null;
for (int i = 0; i < trans.childCount; i++)
{
if (trans.GetChild(i).gameObject.IsInLayerMask(layer))
{
child = trans.GetChild(i);
}
}
if (child != null)
{
return child.GetComponent<T>();
}
Transform go = null;
for (int i = 0; i < trans.childCount; i++)
{
child = trans.GetChild(i);
go = FindFromAllChild<Transform>(child, layer);
if (go != null)
{
return go.GetComponent<T>();
}
}
return null;
}
3.判断该物体是否属于某个层
/// <param name="obj"></param>
/// <param name="layerMask"></param>
/// <returns></returns>
public static bool IsInLayerMask(this GameObject obj, LayerMask layerMask)
{
int objLayerMask = 1 << obj.layer;
return (layerMask.value & objLayerMask) > 0;
}
4.每一个拥有T的脚本 执行某个委托
/// <typeparam name="T"></typeparam>
/// <param name="trans"></param>
/// <param name="goName"></param>
/// <returns></returns>
public static void AllChildDo<T>(this Transform trans, Action<T> _action) where T : UnityEngine.Object
{
if(null!=trans.GetComponent<T>())
_action.Invoke(trans.GetComponent<T>());
for (int i = 0; i < trans.childCount; i++)
{
trans.GetChild(i).AllChildDo(_action);
}
}
5.每一个拥有T的脚本 执行某个委托
/// <typeparam name="T"></typeparam>
/// <param name="trans"></param>
/// <param name="goName"></param>
/// <returns></returns>
public static void AllChildDo<T>(this Transform trans, Predicate<Transform> _condition, Action<T> _action) where T : UnityEngine.Object
{
if (null != trans.GetComponent<T>())
_action.Invoke(trans.GetComponent<T>());
for (int i = 0; i < trans.childCount; i++)
{
trans.GetChild(i).AllChildDo(_action);
}
}