废弃图集,应该删除掉.加载出来需要消耗内存,若显示出来还要drawcall的产生.这些开发时要注意产生与消耗
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using UnityEditor;
using UnityEngine;
public class DCEditor : EditorWindow
{
[MenuItem("Tools/废弃图集的引用")]
public static void ShowWindowDC()
{
EditorWindow.GetWindow<CommonUIWindow>(false);
}
}
public class CommonUIWindow : EditorWindow
{
private string mPathStr;
void OnGUI()
{
EditorGUILayout.EndVertical();
EditorGUILayout.BeginVertical("Box");
{
GUILayout.Label("废弃图集CommonUIAtlas的引用,默认路径(Assets/UI/Prefabs)");
mPathStr = EditorGUILayout.TextField("模块路径:", mPathStr);
if (GUILayout.Button("查看引用者", GUILayout.Height(27)))
{
var tAllPrefabs = GetPrefabs(mPathStr);
for (int i = 0; i < tAllPrefabs.Count; i++)
{
var tPrefab = tAllPrefabs[i];
var tSprites = tPrefab.GetComponentsInChildren<UISprite>(true);
List<UISprite> tHasSprites = new List<UISprite>();
for (int j = 0; j < tSprites.Length; j++)
{
var tSprite = tSprites[j];
if (tSprite.atlas != null && tSprite.atlas.name.Contains("CommonUIAtlas"))
{
if (tHasSprites.Contains(tSprite) == false)
tHasSprites.Add(tSprite);
}
}
if (tHasSprites.Count > 0)
mDicPrefabSprites[tPrefab] = tHasSprites;
}
}
}
EditorGUILayout.BeginVertical("HelpBox", GUILayout.Height(250));
{
mScrollView = EditorGUILayout.BeginScrollView(mScrollView);
var tRootHieView = GameObject.Find("UI Root/Camera");
if (mDicPrefabSprites.Count > 0)
{
foreach (var item in mDicPrefabSprites)
{
var tPrefab = item.Key;
var tSprites = item.Value;
for (int i = 0; i < tSprites.Count; i++)
{
var tSprite = tSprites[i];
if (GUILayout.Button(tPrefab.name + " , " + tSprite.gameObject.name, GUILayout.Height(20)))
{
var tHierarchyGo = GameObject.Find(tPrefab.name);
if (tHierarchyGo == null)
tHierarchyGo = PrefabUtility.InstantiatePrefab(tPrefab) as GameObject;
tHierarchyGo.transform.parent = tRootHieView.transform;
tHierarchyGo.transform.localScale = new Vector3(1, 1, 1);
EditorGUIUtility.PingObject(tPrefab);
var tHierarchySprites = tHierarchyGo.GetComponentsInChildren<UISprite>(true);
for (int j = 0; j < tHierarchySprites.Length; j++)
{
var tHierarch = tHierarchySprites[j];
if (tSprite.atlas == tHierarch.atlas &&
tSprite.spriteName == tHierarch.spriteName &&
tSprite.transform.localPosition == tHierarch.transform.localPosition)
{
Selection.activeGameObject = tHierarchySprites[j].gameObject;
break;
}
}
}
}
}
}
EditorGUILayout.EndScrollView();
}
if (mDicPrefabSprites.Count > 0)
{
mNewAtlas = EditorGUILayout.TextField("新的图集:", mNewAtlas);
mNewSprite = EditorGUILayout.TextField("新的碎图:", mNewSprite);
if (GUILayout.Button("若太多,一口气改成某一张碎图 慎用", GUILayout.Height(27)))
{
if (string.IsNullOrEmpty(mNewAtlas) || string.IsNullOrEmpty(mNewSprite))
{
Debug.LogError("图集或碎图为空");
return;
}
var tNewAtlasGo = FindOneGo("Prefab", mNewAtlas);
var tAtlas = tNewAtlasGo.GetComponent<UIAtlas>();
var tPrefabs = new List<GameObject>();
foreach (var item in mDicPrefabSprites)
{
if (tPrefabs.Contains(item.Key) == false)
tPrefabs.Add(item.Key);
var tSprites = item.Value;
for (int i = 0; i < tSprites.Count; i++)
{
tSprites[i].atlas = tAtlas;
tSprites[i].spriteName = mNewSprite;
}
}
SaveNewPrefabs(tPrefabs);
mDicPrefabSprites.Clear();
}
}
EditorGUILayout.EndVertical();
}
private Dictionary<GameObject, List<UISprite>> mDicPrefabSprites = new Dictionary<GameObject, List<UISprite>>();
private Vector2 mScrollView;
private string mNewAtlas, mNewSprite;
private List<GameObject> GetPrefabs(string pPath)
{
if (string.IsNullOrEmpty(pPath)) pPath = "Assets/UI/Prefabs";
var guids = AssetDatabase.FindAssets("t:Prefab", new string[] { pPath });
List<GameObject> tAllPrefab = new List<GameObject>();
foreach (var item in guids)
{
var go = AssetDatabase.LoadMainAssetAtPath(AssetDatabase.GUIDToAssetPath(item)) as GameObject;
tAllPrefab.Add(go);
}
return tAllPrefab;
}
/// <summary> 也就是Inspector面板 的 Apply按钮 </summary>
private void SaveNewPrefabs(List<GameObject> pWillChanges)
{
if (pWillChanges == null || pWillChanges.Count == 0) return;
for (int i = 0; i < pWillChanges.Count; i++)
{
var tPrefab = pWillChanges[i];
var tOldHierarchyPrefab = PrefabUtility.InstantiatePrefab(tPrefab) as GameObject;
var tPath = AssetDatabase.GetAssetPath(tPrefab);
var tNewEmpty = PrefabUtility.CreateEmptyPrefab(tPath);
PrefabUtility.ReplacePrefab(tOldHierarchyPrefab, tNewEmpty, ReplacePrefabOptions.ConnectToPrefab);
GameObject.DestroyImmediate(tOldHierarchyPrefab);
}
}
/// <summary>得到prefab pFilter:Pefab或Script pGoStr:prefabName </summary>
private GameObject FindOneGo(string pFilter, string pGoStr)
{
var tGuids = AssetDatabase.FindAssets("t:" + pFilter + " " + pGoStr, new string[] { "Assets/UI" });
GameObject tGo = null;
foreach (var guid in tGuids)
{
tGo = AssetDatabase.LoadMainAssetAtPath(AssetDatabase.GUIDToAssetPath(guid)) as GameObject;
}
return tGo;
}
}