using UnityEngine;
using UnityEditor;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.IO;
using LitJson;
public class effectdata {
public int id;
public string oldname;
public string newname;
}
public class EffChangeManager : EditorWindow
{
private List<effectdata> effectdata;
string matName = "";
int needChange = 0;
/// <summary>
/// 特效搜索路徑
/// </summary>
private string effectPath = "Assets/Resource";
private string effectPath1 = "Assets/Resource/ui";
private string effectPath2 = "Assets/Resource/fx";
private string dataPath = "Editor/fxchange/effectdata.json";
private string tempdataPath = "";
private List<string> notPaths = new List<string>();
//-----------------------------------------------------
[MenuItem("HZTools/特效材替換")]
static void AddArtGongJu01()
{
GetWindow<EffChangeManager>("特效材質查看器");
}
void OnGUI()
{
dataPath = EditorGUILayout.TextField("數據目錄:", dataPath);
effectPath = EditorGUILayout.TextField("特效搜索目錄:", effectPath);
if (GUILayout.Button("檢查表中要替換的材質是否存在"))
{
tempdataPath = Application.dataPath + "/"+ dataPath;
StreamReader streamreader = new StreamReader(tempdataPath);//讀取數據,轉換成數據流
JsonReader js = new JsonReader(streamreader);//再轉換成json數據
effectdata = JsonMapper.ToObject<List<effectdata>>(js);//讀取
bool canChange = true;
ShowProgress(0, 0, 0);
int m_jishu = 0;
for (int m = 0; m < effectdata.Count; m++)
{
effectdata tempData = effectdata[m];
if (tempData != null)
{
if (GetFxByName(tempData.newname) == null)
{
canChange = false;
Debug.LogError(tempData.newname + "未找到");
}
}
ShowProgress((float)m_jishu / (float)effectdata.Count, effectdata.Count, m_jishu);
m_jishu++;
}
EditorUtility.ClearProgressBar();
if (canChange)
{
Debug.Log("檢測成功!可以替換");
}
else {
Debug.Log("檢測失敗!");
}
}
if (GUILayout.Button("開始替換材質"))
{
tempdataPath = Application.dataPath + "/" + dataPath;
StreamReader streamreader = new StreamReader(tempdataPath);//讀取數據,轉換成數據流
JsonReader js = new JsonReader(streamreader);//再轉換成json數據
effectdata = JsonMapper.ToObject<List<effectdata>>(js);//讀取
LookupTargetMatUsed();
}
if (GUILayout.Button("檢查沒有引用的材質球"))
{
tempdataPath = Application.dataPath + "/" + dataPath;
StreamReader streamreader = new StreamReader(tempdataPath);//讀取數據,轉換成數據流
JsonReader js = new JsonReader(streamreader);//再轉換成json數據
effectdata = JsonMapper.ToObject<List<effectdata>>(js);//讀取
notPaths.Clear();
ShowProgress(0, 0, 0);
int m_jishu = 0;
for (int m = 0; m < effectdata.Count; m++)
{
effectdata tempData = effectdata[m];
if (tempData != null)
{
DelectNotUse(tempData.oldname);
}
ShowProgress((float)m_jishu / (float)effectdata.Count, effectdata.Count, m_jishu);
m_jishu++;
}
EditorUtility.ClearProgressBar();
}
if (GUILayout.Button("刪除全部沒有引用的材質球"))
{
foreach (var item in notPaths)
{
Debug.Log("成功刪除無用資源" + item);
File.Delete(item);
}
Debug.Log("成功刪除" + notPaths.Count + "個材質資源");
}
if (GUILayout.Button("test"))
{
tempdataPath = Application.dataPath + "/" + dataPath;
StreamReader streamreader = new StreamReader(tempdataPath);//讀取數據,轉換成數據流
JsonReader js = new JsonReader(streamreader);//再轉換成json數據
effectdata = JsonMapper.ToObject<List<effectdata>>(js);//讀取
// LookupTargetMatUsed2();
//for (int m = 0; m < effectdata.Count; m++)
//{
// effectdata tempData = effectdata[m];
// if (tempData.newname == tempData.oldname) {
// Debug.Log(tempData.oldname);
// }
//}
ChangeShader();
}
}
private Material GetFxByName(string matName) {
string[] newNames = AssetDatabase.FindAssets(matName);
foreach (var item in newNames)
{
var assetPath2 = AssetDatabase.GUIDToAssetPath(item);
var asset2 = AssetDatabase.LoadMainAssetAtPath(assetPath2);
var assetObj2 = asset2 as Material;
//var assetObj2 = PrefabUtility.InstantiatePrefab(asset2) as Material;
if (assetObj2 != null)
{
return assetObj2;
}
}
return null;
}
private void DelectNotUse(string notUserMat)
{
var allGuids = AssetDatabase.FindAssets("t:GameObject", new string[] { effectPath });
if (allGuids.Length > 0)
{
int i = 0;
//ShowProgress(0, 0, 0);
//int m_jishu = 0;
foreach (var guid in allGuids)
{
var assetPath = AssetDatabase.GUIDToAssetPath(guid);
var asset = AssetDatabase.LoadMainAssetAtPath(assetPath);
var assetObj = asset as GameObject;
var rends = assetObj.GetComponentsInChildren<Renderer>();
if (rends.Length > 0)
{
foreach (var rend in rends)
{
var mats = rend.sharedMaterials;
if (mats.Length > 0)
{
for (int j = 0; j < mats.Length; j++)
{
if (mats[j] != null)
{
Material temp = mats[j];
if (temp.name == notUserMat)
{
i = i + 1;
}
}
}
}
}
}
//ShowProgress((float)m_jishu / (float)allGuids.Length, allGuids.Length, m_jishu);
//m_jishu++;
}
//EditorUtility.ClearProgressBar();
if (i == 0)
{
Debug.LogWarning(notUserMat);
string[] newNames = AssetDatabase.FindAssets(notUserMat);
foreach (var item in newNames)
{
var assetPath3 = AssetDatabase.GUIDToAssetPath(item);
var asset3 = AssetDatabase.LoadMainAssetAtPath(assetPath3);
var assetObj3 = asset3 as Material;
if (assetObj3 != null)
{
Debug.Log("無用資源路徑" + assetPath3+" "+ assetObj3.name);
notPaths.Add(assetPath3);
break;
}
}
}
}
}
private void LookupTargetMatUsed2()
{
needChange = 0;
var allGuids = AssetDatabase.FindAssets("uirecharge");
if (allGuids.Length > 0)
{
int i = 0;
ShowProgress(0, 0, 0);
int m_jishu = 0;
foreach (var guid in allGuids)
{
var assetPath = AssetDatabase.GUIDToAssetPath(guid);
var asset = AssetDatabase.LoadMainAssetAtPath(assetPath);
var assetObj = PrefabUtility.InstantiatePrefab(asset) as GameObject;
Debug.LogWarning(assetPath);
if (assetObj == null) {
Debug.LogError(assetPath);
continue;
}
bool isNeed = false;
if (matName != assetObj.name)
{
matName = assetObj.name;
Debug.LogWarning(matName);
}
var rends = assetObj.GetComponentsInChildren<ParticleSystemRenderer>(true);
if (rends.Length > 0)
{
foreach (var rend in rends)
{
var mats = rend.sharedMaterials;
var trailMat = rend.trailMaterial;
ChangeTrailMat(trailMat);
if (mats.Length > 0)
{
for (int j = 0; j < mats.Length; j++)
{
if (mats[j] != null)
{
Material temp = mats[j];
for (int m = 0; m < effectdata.Count; m++)
{
effectdata tempData = effectdata[m];
if (tempData != null)
{
if (temp.name == tempData.oldname)
{
Debug.Log(string.Format("當前材質{0},舊的材質名{1},新替換的材質名{2},randname{3}", temp.name, tempData.oldname, tempData.newname, rend.name));
ShowProgress((float)m_jishu / (float)allGuids.Length, allGuids.Length, m_jishu);
m_jishu++;
var assetObj2 = GetFxByName(tempData.newname);
if (assetObj2 != null)
{
mats[j] = assetObj2;
isNeed = true;
if (mats[j].name == tempData.newname)
{
Debug.Log(string.Format("{0}成功替換{1}", matName, tempData.newname));
}
else {
Debug.LogError(string.Format("{0}替換失敗{1}", matName, tempData.newname));
}
}
else
{
Debug.LogError("未找到 " + tempData.newname);
}
i = i + 1;
}
}
}
}
}
if (isNeed)
{
rend.materials = mats;
}
}
}
}
if (!isNeed)
{
Debug.Log(string.Format("{0}不需要替換材質", matName));
}
else
{
try
{
PrefabUtility.ReplacePrefab(assetObj, asset);
}
catch (System.Exception ex)
{
Debug.LogWarning(ex.ToString() + assetObj.name);
}
AssetDatabase.SaveAssets();
needChange++;
}
GameObject.DestroyImmediate(assetObj);
}
EditorUtility.ClearProgressBar();
if (i == 0)
{
Debug.LogWarning(">>>>>>>>>>>>>>>!目標材質沒有被使用!<<<<<<<<<<<<<<<<<<<<<<<<<<");
}
if (i > 0)
{
Debug.LogWarning("替換" + needChange + "個特效!!!");
}
}
}
private void LookupTargetMatUsed()
{
needChange = 0;
var allGuids = AssetDatabase.FindAssets("t:GameObject", new string[] { effectPath });
if (allGuids.Length > 0)
{
int i = 0;
ShowProgress(0, 0, 0);
int m_jishu = 0;
foreach (var guid in allGuids)
{
//if (m_jishu >= 20) {
// break;
//}
var assetPath = AssetDatabase.GUIDToAssetPath(guid);
var asset = AssetDatabase.LoadMainAssetAtPath(assetPath);
var assetObj = PrefabUtility.InstantiatePrefab(asset) as GameObject;
bool isNeed = false;
if (matName != assetObj.name) {
matName = assetObj.name;
Debug.LogWarning(matName);
}
var rends = assetObj.GetComponentsInChildren<ParticleSystemRenderer>(true);
if (rends.Length > 0)
{
foreach (var rend in rends)
{
var mats = rend.sharedMaterials;
var trailMat = rend.trailMaterial;
ChangeTrailMat(trailMat);
if (mats.Length > 0)
{
for (int j = 0; j < mats.Length; j++)
{
if (mats[j] != null) {
Material temp = mats[j];
for (int m = 0; m < effectdata.Count; m++)
{
effectdata tempData = effectdata[m];
if (tempData != null)
{
if (temp.name == tempData.oldname)
{
Debug.Log(string.Format("當前材質{0},舊的材質名{1},新替換的材質名{2}", temp.name, tempData.oldname, tempData.newname));
var assetObj2 = GetFxByName(tempData.newname);
if (assetObj2 != null)
{
mats[j] = assetObj2;
isNeed = true;
if (mats[j].name == tempData.newname)
{
Debug.Log(string.Format("{0}成功替換{1}", matName, tempData.newname));
}
else
{
Debug.LogError(string.Format("{0}替換失敗{1}", matName, tempData.newname));
}
}
else
{
Debug.LogError("未找到 " + tempData.newname);
}
i = i + 1;
}
}
}
}
}
if (isNeed)
{
rend.materials = mats;
}
}
}
}
if (!isNeed)
{
Debug.Log(string.Format("{0}不需要替換材質", matName));
}
else {
try
{
PrefabUtility.ReplacePrefab(assetObj, asset);
}
catch (System.Exception ex)
{
Debug.LogWarning(ex.ToString() + assetObj.name);
}
AssetDatabase.SaveAssets();
needChange++;
}
GameObject.DestroyImmediate(assetObj);
ShowProgress((float)m_jishu / (float)allGuids.Length, allGuids.Length, m_jishu);
m_jishu++;
}
EditorUtility.ClearProgressBar();
if (i == 0)
{
Debug.LogWarning(">>>>>>>>>>>>>>>!目標材質沒有被使用!<<<<<<<<<<<<<<<<<<<<<<<<<<");
}
if (i > 0)
{
Debug.LogWarning("替換" + needChange+"個特效!!!");
}
AssetDatabase.Refresh();
}
}
public void ChangeTrailMat(Material mat) {
if (mat == null) {
return;
}
for (int m = 0; m < effectdata.Count; m++)
{
effectdata tempData = effectdata[m];
if (tempData != null)
{
if (mat.name == tempData.oldname)
{
Debug.Log(string.Format("當前材質{0},舊的材質名{1},新替換的材質名{2}", mat.name, tempData.oldname, tempData.newname));
var assetObj2 = GetFxByName(tempData.newname);
if (assetObj2 != null)
{
mat = assetObj2;
if (mat.name == tempData.newname)
{
Debug.Log(string.Format("{0}成功替換{1}", matName, tempData.newname));
}
else
{
Debug.Log(string.Format("{0}替換失敗{1}", matName, tempData.newname));
}
}
else
{
Debug.LogError("未找到 " + tempData.newname);
}
}
}
}
}
/// <summary>
/// 開啓進度條窗口
/// </summary>
/// <param name="val">Value.</param>
/// <param name="total">Total.</param>
/// <param name="cur">Current.</param>
public static void ShowProgress(float val, int total, int cur)
{
EditorUtility.DisplayProgressBar("查找中!", string.Format("查找 ({0}/{1}), 請稍等...", cur, total), val);
}
public void ChangeShader()
{
// var allGuids = AssetDatabase.FindAssets("db-lh-xyh-m");
int matNum = 0;
var allGuids = AssetDatabase.FindAssets("t:Material", new string[] { "Assets/Resource/ui/db-ani" });
if (allGuids.Length > 0)
{
foreach (var guid in allGuids)
{
var assetPath = AssetDatabase.GUIDToAssetPath(guid);
var asset = AssetDatabase.LoadMainAssetAtPath(assetPath);
var assetObj = asset as Material;
if (assetObj == null)
{
//Debug.LogError(assetPath);
continue;
}
if (matName != assetObj.name)
{
matName = assetObj.name;
Debug.LogWarning(matName);
}
//Debug.Log(assetObj.shader.name);
if (assetObj.shader.name == "DragonBones/BlendModes/Old")
{
Debug.LogWarning(assetPath);
matNum++;
assetObj.shader = Shader.Find("Sprites/Default");
}
}
}
Debug.Log("替換了 "+ matNum);
}
}
替換所有材質球
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.