Unity 编辑器功能之查找预制体

  static readonly string[] PREFAB_PATHS = new string[]
    {
             "Assets/GameRes/UIPanel",
    };

//预制体存放路径 

思路  通过文件夹得到所有的预制体,生成预制体,然后遍历所有预制体以及子物体是否存在 主键T如果存在进行callback操作,操作完之后根据savePrefab 进行保存,然后销毁

 static void ScanPrefabComponment<T>(Action<string, T> callback, bool savePrefab = false)
    {
        for (int i = 0; i < PREFAB_PATHS.Length; ++i)
        {
            DirectoryInfo dir = new DirectoryInfo(PREFAB_PATHS[i]);
            FileInfo[] files = dir.GetFiles("*.prefab", SearchOption.AllDirectories);

            for (int j = 0; j < files.Length; ++j)
            {
                string prefabPath = files[j].FullName.Substring(files[j].FullName.IndexOf("Assets"));
                try
                {
                    GameObject target = AssetDatabase.LoadAssetAtPath(prefabPath, typeof(GameObject)) as GameObject;
                    target = PrefabUtility.InstantiatePrefab(target) as GameObject;
                    _ScanPrefabComponment<T>(prefabPath, target.transform, callback);
                    if (savePrefab)
                    {
                        PrefabUtility.SaveAsPrefabAsset(target, prefabPath);
                    }
                    GameObject.DestroyImmediate(target); 
                }
                catch (Exception e)
                {
                    Debug.LogError($"Analyze prefab: {prefabPath} failed: " + e.Message + " StackTrace: " + e.StackTrace);
                }
            }
        }
    }

    static void _ScanPrefabComponment<T>(string prefabPath, Transform transform, Action<string, T> callback)
    {
        T comp = transform.GetComponent<T>();
        if (comp != null)
        {
            callback(prefabPath, comp);
        }

        for (int i = 0; i < transform.childCount; ++i)
        {
            _ScanPrefabComponment(prefabPath, transform.GetChild(i), callback);
        }
    }

//编辑器按钮

 [MenuItem("Tools/AddCanvas")]

 public static void AddButtonScaleEffect()
    {
        parent = GameObject.Find("Canvas").gameObject;
        ScanPrefabComponment<UIPanel>((prefabPath, text) =>
        {
            if (text.gameObject.GetComponent<GraphicRaycaster>() == null)
            {
                GraphicRaycaster graphicRaycaster = text.gameObject.AddComponent<GraphicRaycaster>();
                isChange = true;
            }
            if (text.gameObject.GetComponent<Canvas>() == null)
            {
                Canvas canvas = text.gameObject.AddComponent<Canvas>();
                canvas.overrideSorting = true;
                canvas.additionalShaderChannels = AdditionalCanvasShaderChannels.TexCoord1 | AdditionalCanvasShaderChannels.TexCoord2 | AdditionalCanvasShaderChannels.TexCoord3;
                isChange = true;
            }
            if (text.gameObject.GetComponent<CanvasScaler>() == null)
            {
                CanvasScaler canvasScaler = text.gameObject.AddComponent<CanvasScaler>();
                isChange = true;
            }
        });
    }

  • 26
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值