using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEditor; using BF; namespace BFEditor { [CustomEditor(typeof(PrefabHelper))] public class PrefabHelperInspector : Editor { private const uint HASH_SEED = 31; PrefabHelper helper; private ISet gameobjectSet = new HashSet(); private ISet hashNameSet = new HashSet(); private ISet nameSet = new HashSet(); void OnEnable() { helper = target as PrefabHelper; } public override void OnInspectorGUI() { gameobjectSet.Clear(); hashNameSet.Clear(); nameSet.Clear(); GUILayout.Space(10); for (int i = 0; i < helper.prefabList.Count; ++i) { DrawPrefab(i); HashName(i); CheckPrefabList(i); } DrawAddBtn(); DrawAddTenBtn(); DrawClipBoardBtn(); DrawUpdateAllBtn(); } void DrawPrefab(int index) { if (index < 0 || index >= helper.prefabList.Count) return; GUILayout.BeginHorizontal(); { EditorGUI.BeginChangeCheck(); GameObject go = (GameObject)EditorGUILayout.ObjectField("", helper.prefabList[index].gameObject, typeof(GameObject), true, GUILayout.Width(140)); if (EditorGUI.EndChangeCheck()) { Undo.RecordObject(helper, helper.name + "Change GameObject Info GameObject"); GameObjectInfo info = new GameObjectInfo(); string path = ""; if (go == null) { info.gameObject = go; } else { Utils.GetTransformPath(go.transform, helper.transform, ref path); path = path.Replace("/", "."); info.gameObject = go; info.name = path; info.hashName = BKDRHash(path); info.objectType = GetGameObjectType(go); } helper.prefabList[index] = info; EditorUtility.SetDirty(helper); } if (GUILayout.Button("Copy", GUILayout.Width(55))) { Undo.RecordObject(helper, helper.name + "Copy Name"); EditorApplication.Beep(); TextEditor te = new TextEditor(); var goInfo = helper.prefabList[index]; te.text = goInfo.name; te.SelectAll(); te.Copy(); } if (GUILayout.Button("Remove", GUILayout.Width(55))) { Undo.RecordObject(helper, helper.name + "Remove GameObject Info"); EditorApplication.Beep(); helper.prefabList.RemoveAt(index); EditorUtility.SetDirty(helper); } if (GUILayout.Button("Update", GUILayout.Width(55))) { Undo.RecordObject(helper, helper.name + "Update GameObject Info"); EditorApplication.Beep(); var goInfo = helper.prefabList[index]; var newPath = string.Empty; Utils.GetTransformPath(go.transform, helper.transform, ref newPath); newPath = newPath.Replace("/", "."); goInfo.name = newPath; goInfo.hashName = BKDRHash(newPath); helper.prefabList[index] = goInfo; EditorUtility.SetDirty(helper); } GUILayout.Label(GetGameObjectTypeName(helper.prefabList[index].objectType), EditorStyles.label, GUILayout.Width(40)); GUILayout.Label("Name", EditorStyles.label, GUILayout.Width(35)); EditorGUI.BeginChangeCheck(); string newName = GUILayout.TextField(helper.prefabList[index].name); if (EditorGUI.EndChangeCheck()) { Undo.RecordObject(helper, helper.name + "Change GameObject Info name"); GameObjectInfo info = new GameObjectInfo(); info.gameObject = helper.prefabList[index].gameObject; info.name = newName; info.hashName = BKDRHash(newName); info.objectType = GetGameObjectType(info.gameObject); helper.prefabList[index] = info; EditorUtility.SetDirty(helper); } } GUILayout.EndHorizontal(); } void HashName(int index) { if (index < 0 || index >= helper.prefabList.Count) return; if (!string.IsNullOrEmpty(helper.prefabList[index].name)) { uint hashName = BKDRHash(helper.prefabList[index].name); if (hashName != helper.prefabList[index].hashName) { Undo.RecordObject(helper, helper.name + "add hash name"); GameObjectInfo info = new GameObjectInfo(); info.gameObject = helper.prefabList[index].gameObject; info.name = helper.prefabList[index].name; info.hashName = hashName; info.objectType = GetGameObjectType(info.gameObject); helper.prefabList[index] = info; EditorUtility.SetDirty(helper); } } } void CheckPrefabList(int index) { if (index < 0 || index >= helper.prefabList.Count) return; GameObjectInfo info = helper.prefabList[index]; if (info.gameObject == null) { return; } if (!gameobjectSet.Add(info.gameObject)) { Debug.LogError("prefab list have the same GameObject"); } if (!hashNameSet.Add(info.hashName)) { Debug.LogError("prefab list have the same hashName"); } if (!nameSet.Add(info.name)) { Debug.LogError("prefab list have the same name"); } } void DrawAddBtn() { if (GUILayout.Button("Add")) { Undo.RecordObject(helper, helper.name + "Add GameObject Info"); EditorApplication.Beep(); helper.prefabList.Add(new GameObjectInfo()); EditorUtility.SetDirty(helper); } } void DrawAddTenBtn() { if (GUILayout.Button("AddTen")) { for (int i = 0; i < 10; i++) { Undo.RecordObject(helper, helper.name + "Add GameObject Info"); EditorApplication.Beep(); helper.prefabList.Add(new GameObjectInfo()); EditorUtility.SetDirty(helper); } } } void DrawClipBoardBtn() { if (GUILayout.Button("ClipBoardMap")) { string content = string.Empty; var list = helper.prefabList; for (int i = 0; i < list.Count; i++) { var info = list[i]; var objectName = info.gameObject.name; var splits = objectName.Split('_'); for(int j = 1; j < splits.Length; j++) { splits[j] = splits[j].Substring(0, 1).ToUpper() + splits[j].Substring(1); } var outName = string.Join("", splits); var itemDesc = string.Format("local {0} = uiMap[\"{1}\"]\n", outName, info.name); content += itemDesc; } GUIUtility.systemCopyBuffer = content; } } void DrawUpdateAllBtn() { if (GUILayout.Button("UpdateAll")) { string content = string.Empty; var list = helper.prefabList; for (int i = 0; i < list.Count; i++) { Undo.RecordObject(helper, helper.name + "Update GameObject Info"); EditorApplication.Beep(); var goInfo = helper.prefabList[i]; var newPath = string.Empty; Utils.GetTransformPath(goInfo.gameObject.transform, helper.transform, ref newPath); newPath = newPath.Replace("/", "."); goInfo.name = newPath; goInfo.hashName = BKDRHash(newPath); helper.prefabList[i] = goInfo; EditorUtility.SetDirty(helper); } } } private static uint BKDRHash(string name) { uint h = 0; var chars = name.ToCharArray(); for (int i = 0; i < chars.Length; ++i) { h = h * HASH_SEED + (byte)chars[i]; } return h; } private static string GetGameObjectTypeName(int gameObjectType) { switch (gameObjectType){ case (int)GameObjectType.Default: return "默认"; case (int)GameObjectType.UIObject: return "UI预制件"; case (int)GameObjectType.EffectObject: return "特效"; case (int)GameObjectType.CharacterObject: return "角色"; case (int)GameObjectType.SpineMeshObject: return "MeshSpine"; case (int)GameObjectType.SpineUIObject: return "UISpine"; case (int)GameObjectType.TimelineObject: return "TimeLine"; default: return "默认"; } } private static int GetGameObjectType(GameObject go) { if (go == null) { return (int)GameObjectType.Default; } if (go.GetComponent() != null) { return (int)GameObjectType.UIObject; } else if(go.GetComponent() != null) { return (int)GameObjectType.EffectObject; } else if(go.GetComponent() != null) { return (int)GameObjectType.CharacterObject; } else if(go.GetComponent() != null) { return (int)GameObjectType.TimelineObject; } else if(go.GetComponent() != null) { return (int)GameObjectType.SpineUIObject; } else if(go.GetComponent() != null) { return (int)GameObjectType.SpineMeshObject; } return (int)GameObjectType.Default; } [MenuItem("GameObject/UI/PrefabHelper/AddItem &n")] static public void AddItemByHotkey() { var obj = Selection.activeObject; if (null != obj && obj is GameObject) { var gameObj = obj as GameObject; var tf = gameObj.transform; var pbHelper = tf.GetComponentInParent(); if (pbHelper) { Debug.Log("Add GameObject " + gameObj.name); Undo.RecordObject(pbHelper, pbHelper.name + "Add GameObject Info"); EditorApplication.Beep(); var path = string.Empty; Utils.GetTransformPath(tf, pbHelper.transform, ref path); path = path.Replace("/", "."); pbHelper.prefabList.Add(new GameObjectInfo() { gameObject = gameObj, name = path, hashName = BKDRHash(path), objectType = GetGameObjectType(gameObj) }); EditorUtility.SetDirty(pbHelper); } } } } }