unity查找子物體、子節點、獲取子節點對象腳本,添加子節點腳本,添加父節點腳本

分享一個代碼管理片段的代碼,主要是用於查找子物體,控制子物體等等的。

靜態代碼片段,便於調用。

不做太多的解釋,直接上代碼,每個方法都有註釋。

有任何問題直接留言,看到會回覆 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;
    }

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章