美文网首页
Unity 一键替换 工具

Unity 一键替换 工具

作者: 张晓强_843d | 来源:发表于2019-10-08 10:10 被阅读0次

using UnityEngine;

using System.Collections;

using System.Collections.Generic;

using UnityEditor;

using UnityEngine.UI;

using System.Text;

using System.IO;

public class ArtResTools_RepleceOutlineToOutlineEx

{

      static Canvas canv;

      static  int allPrefablen;

      static int currentLen;

    [MenuItem("Assets/Tools/替换outlineToOutlineEx", false)]

    public static void RepleaceOutlineToOutlineEx()

    {

        canv=InstanceCanvas();

        var res = AssetDatabase.FindAssets("t:Prefab", new string[] {

            "Assets/AssetsPackage/UI/Prefabs"

        });

      allPrefablen=res.Length;

        if (res == null || res.Length < 1) return;

        for (int i = 0 ; i < res.Length ; i++)

        {

          currentLen=i;

            string path = AssetDatabase.GUIDToAssetPath( res[i] );

            //string path="Assets/AssetsPackage/UI/Prefabs/View/UICardPool.prefab";

            var pb = AssetDatabase.LoadAssetAtPath<GameObject>(path);

            if (pb == null) continue;

            //实例化prefab

            var prefabInst=PrefabUtility.InstantiatePrefab(pb) as GameObject;

            if(canv==null){

            Debug.LogWarning("canvas 为空");

            }

            prefabInst.transform.SetParent(canv.transform,false);

            //找到有outline的替換掉

            FindOutLineAndReplece(prefabInst.transform);

            PrefabUtility.ApplyPrefabInstance(prefabInst,InteractionMode.AutomatedAction);

            GameObject.DestroyImmediate(prefabInst); 

        } 

            if(canv)

            GameObject.DestroyImmediate(canv.gameObject);

            AssetDatabase.SaveAssets();

            AssetDatabase.Refresh();

            EditorUtility.ClearProgressBar(); 

        }

    public static Canvas InstanceCanvas(){

        GameObject canvas=new GameObject("UICanvasTest");

        Canvas canv=canvas.AddComponent<Canvas>();

        canvas.AddComponent<CanvasScaler>();

        canv.transform.localPosition=Vector3.one;

        canvas.transform.localRotation=Quaternion.identity;

        canv.renderMode=RenderMode.ScreenSpaceCamera;

        canv.worldCamera=Camera.main;

        canv.sortingLayerID=0;

        canvas.GetComponent<CanvasScaler>().uiScaleMode=CanvasScaler.ScaleMode.ScaleWithScreenSize;

        canvas.GetComponent<CanvasScaler>().referenceResolution=new Vector2(1920,1080);

        canvas.GetComponent<CanvasScaler>().matchWidthOrHeight=1;

        return canv;

    }

    public static void FindOutLineAndReplece(Transform rootTrans)

    { 

        Outline[] outLines=rootTrans.GetComponentsInChildren<Outline>(true);

        for(int i=outLines.Length-1;i>=0;i--)

        {

            var outline=outLines[i];

            var trans=outline.transform;

            if(outline){

            var outlinecolor=outline.effectColor;

            //加一

            float outlineWidth=Mathf.Abs(outline.effectDistance.x)+1;

            GameObject.DestroyImmediate(outline);

            trans.gameObject.AddComponent<OutlineEx>();

            trans.GetComponent<OutlineEx>().OutlineColor=outlinecolor;

            trans.GetComponent<OutlineEx>().OutlineWidth=(int)outlineWidth;

            EditorUtility.DisplayProgressBar(string.Format("正在替換{0}/{1}",currentLen,allPrefablen), PrefabUtility.FindPrefabRoot(trans.gameObject).name,currentLen*1f/allPrefablen);

          // Debug.Log("替換 "+trans.name+" 成功");

        }}

    }

    }

相关文章

网友评论

      本文标题:Unity 一键替换 工具

      本文链接:https://www.haomeiwen.com/subject/dfzvpctx.html