分享一個代碼管理片段的代碼,主要是用於查找子物體,控制子物體等等的。
靜態代碼片段,便於調用。
不做太多的解釋,直接上代碼,每個方法都有註釋。
有任何問題直接留言,看到會回覆 QQ791719266 備註“CSDN 查找子物體”
/// <summary>
/// 查找子物體
/// </summary>
/// <param name="parent"></param>
/// <param name="childName"></param>
/// <returns></returns>
public static Transform FindChild(Transform parent, string childName)
{
Transform child = parent.Find(childName);
if (child != null)
return child;
for (int i = 0; i < parent.childCount; i++)
{
child = FindChild(parent.GetChild(i), childName);
if (child != null)
return child;
}
return null;
}
/// <summary>
/// 查找子物體
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="parent"></param>
/// <param name="childName"></param>
/// <returns></returns>
public static T FindChild<T>(Transform parent, string childName)
{
Transform child = FindChild(parent, childName);
if (null != child)
return child.GetComponent<T>();
else
return default(T);
}
/// <summary>
/// 查找子節點對象
/// 內部使用“遞歸算法”
/// </summary>
/// <param name="goParent">父對象</param>
/// <param name="chiildName">查找的子對象名稱</param>
/// <returns></returns>
public static Transform FindTheChildNode(GameObject goParent, string chiildName)
{
Transform searchTrans = null; //查找結果
searchTrans = goParent.transform.Find(chiildName);
if (searchTrans == null)
{
foreach (Transform trans in goParent.transform)
{
searchTrans = FindTheChildNode(trans.gameObject, chiildName);
if (searchTrans != null)
{
return searchTrans;
}
}
}
return searchTrans;
}
/// <summary>
/// 獲取子節點(對象)腳本
/// </summary>
/// <typeparam name="T">泛型</typeparam>
/// <param name="goParent">父對象</param>
/// <param name="childName">子對象名稱</param>
/// <returns></returns>
public static T GetTheChildNodeComponetScripts<T>(GameObject goParent, string childName) where T : Component
{
Transform searchTranformNode = null; //查找特定子節點
searchTranformNode = FindTheChildNode(goParent, childName);
if (searchTranformNode != null)
{
return searchTranformNode.gameObject.GetComponent<T>();
}
else
{
return null;
}
}
/// <summary>
/// 給子節點添加腳本
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="goParent">父對象</param>
/// <param name="childName">子對象名稱</param>
/// <returns></returns>
public static T AddChildNodeCompnent<T>(GameObject goParent, string childName) where T : Component
{
Transform searchTranform = null; //查找特定節點結果
//查找特定子節點
searchTranform = FindTheChildNode(goParent, childName);
//如果查找成功,則考慮如果已經有相同的腳本了,則先刪除,否則直接添加。
if (searchTranform != null)
{
//如果已經有相同的腳本了,則先刪除
T[] componentScriptsArray = searchTranform.GetComponents<T>();
for (int i = 0; i < componentScriptsArray.Length; i++)
{
if (componentScriptsArray[i] != null)
{
Destroy(componentScriptsArray[i]);
}
}
return searchTranform.gameObject.AddComponent<T>();
}
else
{
return null;
}
//如果查找不成功,返回Null.
}
/// <summary>
/// 給子節點添加父對象
/// </summary>
/// <param name="parents">父對象的方位</param>
/// <param name="child">子對象的方法</param>
public static void AddChildNodeToParentNode(Transform parents, Transform child)
{
child.SetParent(parents, false);
child.localPosition = Vector3.zero;
child.localScale = Vector3.one;
child.localEulerAngles = Vector3.zero;
}