Unity 编辑器下Image美术资源一键替换

最近鱼鱼又又又又遇到了一个繁琐的工作,在进行开发时,美术资源很可能会替换,之前都是一个一个用鼠标拖Sprite去给Image赋值,这就很麻烦,于是趁Boss不在花了一个下午时间摸鱼写出了一个编辑器工具,用于解放双手。

请看

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEditor;
using System;

public class AutoReplaceSprite : EditorWindow
{
    private string oldFileName= "ArtChuJi";
    private string newFileName= "ArtRes";
    private string info;
    [MenuItem("Tool/ReplaceArt")]
    private static void Replace()
    {
        //Debug.LogWarning("注意!新资源文件的目录结构和资源名字必须保持一致!!!");
        //Debug.LogWarning("注意!新资源文件的目录结构和资源名字必须保持一致!!!");

        AutoReplaceSprite replaceSprite = EditorWindow.GetWindowWithRect<AutoReplaceSprite>(new Rect(0,0,300,150),true, "替换UI资源");

    }

    private void OnGUI()
    {
        //GUI.Label(new Rect(0, 0, 260, 15), "新资源文件的目录结构和资源名字必须保持一致");
        GUILayout.Label("新资源文件的目录结构和资源名字必须保持一致");
        GUILayout.Label("旧文件:"); oldFileName=GUI.TextField(new Rect(55,23,100,15),oldFileName);
        GUILayout.Label( "新文件:"); newFileName = GUI.TextField(new Rect(55,42,100,15), newFileName);
        GUILayout.Label(info);
        if(GUI.Button(new Rect(100,100,100,20),"一键替换"))
        {
            StartReplace();
        }

        if(Selection.activeGameObject != null)
        {
            info = "";
        }
    }

    private void StartReplace()
    {
        if (Selection.activeTransform == null)
        {
            info = "请选中一个UI根Transform";
            return;
        }
        Replacing(Selection.activeTransform);

    }

    private void Replacing(Transform node)
    {
        Transform[] nodes= node.GetComponentsInChildren<Transform>();
        Image theImage = null;
        Sprite theSprite = null;
        if (nodes.Length <= 0)
        {
            Debug.Log("没有要替换的资源");
            return;
        }
        for(int i = 0; i < nodes.Length; i++)
        {
            EditorUtility.DisplayProgressBar("替换资源", nodes[i].name,i/nodes.Length );
            theImage = nodes[i].GetComponent<Image>();
            if (theImage != null)
            {
                //替换
                theSprite = theImage.sprite;
                if (theSprite != null && AssetDatabase.Contains(theSprite))
                {
                    //找到资源地址
                    string path = AssetDatabase.GetAssetPath(theSprite);

                    //更新资源
                    string newPath = path.Replace(oldFileName, newFileName);
                    UnityEngine.Object[] newSprite = AssetDatabase.LoadAllAssetRepresentationsAtPath(newPath) ;

                    if (newSprite.Length == 0)
                    {
                        Debug.LogWarning(nodes[i].name + "的图片" + theSprite.name +"寻找资源失败—"+ "地址:" + path);
                        continue;
                    }
                    bool ok = false;
                    for (int x = 0; x < newSprite.Length; x++)
                    {
                        if (theSprite.name == newSprite[x].name)
                        {
                            theImage.sprite = newSprite[x] as Sprite;
                            Debug.Log(nodes[i].name + "的图片" + theSprite.name + "替换成功" + "地址:" + path);
                            ok = true;
                            break;
                        }

                    }
                    if(!ok)
                    Debug.LogWarning(nodes[i].name+"的图片"+theSprite.name+"资源名不匹配"+"地址:"+path);
                }

            }

        }
        Debug.Log("完成");
        EditorUtility.ClearProgressBar();
          
    }

   


}

并不是很智能,注意文件夹名字即可

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值