最近鱼鱼又又又又遇到了一个繁琐的工作,在进行开发时,美术资源很可能会替换,之前都是一个一个用鼠标拖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();
}
}
并不是很智能,注意文件夹名字即可