123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332 |
- using System.Reflection;
- namespace labelUtility
- {
- using System;
- using System.Collections;
- using System.Collections.Generic;
- using UnityEditor;
- using UnityEngine;
- [CustomPropertyDrawer(typeof(LabelSet))]
- public class LabelSetDrawer : PropertyDrawer
- {
- #region Config
- private float LineSpan = 2;
- private float LineHeight = 16;
- private float ButtonSpan = 4;
- private float ButtonHeight = 32;
- private LabelSet Instance;
- private SerializedProperty Name;
- private SerializedProperty UtilityType;
- private SerializedProperty LabelScriptPath;
- private SerializedProperty LabelScriptName;
- private SerializedProperty LabePrefix;
- private SerializedProperty LabelScript;
- private SerializedProperty ComponentScriptPath;
- private SerializedProperty ComponentScriptName;
- private SerializedProperty DerivedString;
- private SerializedProperty RegistMethodString;
- private SerializedProperty ComponentPrefix;
- private SerializedProperty NameExcludeString;
- private SerializedProperty RegistString;
- private SerializedProperty RegistExtraLines;
- private SerializedProperty ComponentScript;
- private SerializedProperty Languages;
- private SerializedProperty Prefabs;
- private SerializedProperty Types;
- private SerializedProperty RegistTargets;
- private bool RegistTargetsChangeFlag;
- private List<RegistTarget> registTargets = new List<RegistTarget>();
- #endregion
- public override float GetPropertyHeight(SerializedProperty property, GUIContent label)
- {
- Instance = (LabelSet) InstanceUtility.GetObject(fieldInfo, property);
- return Instance.TotalHeight;
- }
- public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)
- {
- Instance = (LabelSet) InstanceUtility.GetObject(fieldInfo, property);
- Name = property.FindPropertyRelative("Name");
- UtilityType = property.FindPropertyRelative("UtilityType");
- LabelScriptPath = property.FindPropertyRelative("LabelScriptPath");
- LabelScriptName = property.FindPropertyRelative("LabelScriptName");
- LabePrefix = property.FindPropertyRelative("LabePrefix");
- LabelScript = property.FindPropertyRelative("LabelScript");
- ComponentScriptPath = property.FindPropertyRelative("ComponentScriptPath");
- ComponentScriptName = property.FindPropertyRelative("ComponentScriptName");
- DerivedString = property.FindPropertyRelative("DerivedString");
- RegistMethodString = property.FindPropertyRelative("RegistMethodString");
- ComponentPrefix = property.FindPropertyRelative("ComponentPrefix");
- NameExcludeString = property.FindPropertyRelative("NameExcludeString");
- RegistString = property.FindPropertyRelative("RegistString");
- RegistExtraLines = property.FindPropertyRelative("RegistExtraLines");
- ComponentScript = property.FindPropertyRelative("ComponentScript");
- Languages = property.FindPropertyRelative("Languages");
- Prefabs = property.FindPropertyRelative("Prefabs");
- Types = property.FindPropertyRelative("RegistTypes");
- RegistTargets = property.FindPropertyRelative("RegistTargets");
- if (RegistTargetsChangeFlag)
- {
- if (Instance.RegistTargets == registTargets)
- {
- RegistTargetsChangeFlag = false;
- }
- else
- {
- Instance.RegistTargets = registTargets;
- }
- }
- float originY = position.y;
- position.height = LineHeight;
- Instance.FoldOut = EditorGUI.Foldout(position, Instance.FoldOut, new GUIContent(Instance.Name));
- position.y += LineHeight + LineSpan;
- if (Instance.FoldOut)
- {
- EditorGUI.indentLevel++;
- position = DrawProperty(position, Name);
- position = DrawProperty(position, UtilityType);
- bool drawRegistArea = Instance.UtilityType == labelUtility.UtilityType.Regist;
- bool drawXmlArea = Instance.UtilityType == labelUtility.UtilityType.XmlLabel;
- bool drawLabelArea = Instance.UtilityType == labelUtility.UtilityType.Regist || Instance.UtilityType == labelUtility.UtilityType.XmlLabel || Instance.UtilityType == labelUtility.UtilityType.PrefabLabel;
- if (drawLabelArea)
- {
- if (Instance.LabelScript == null)
- {
- position = DrawProperty(position, LabelScriptPath);
- position = DrawProperty(position, LabelScriptName);
- position = DrawProperty(position, LabePrefix);
- }
- position = DrawProperty(position, LabelScript);
- }
- if (drawRegistArea)
- {
- if (Instance.ComponentScript == null)
- {
- position = DrawProperty(position, ComponentScriptPath);
- position = DrawProperty(position, ComponentScriptName);
- position = DrawProperty(position, DerivedString);
- position = DrawProperty(position, RegistMethodString);
- }
- position = DrawProperty(position, ComponentScript);
- position = DrawProperty(position, ComponentPrefix);
- position = DrawProperty(position, NameExcludeString);
- position = DrawProperty(position, RegistString);
- position = DrawPropertys(position, RegistExtraLines, LineHeight + LineSpan);
- }
- if (drawXmlArea)
- {
- position = DrawPropertys(position, Languages, LineHeight + LineSpan);
- }
- else if (drawLabelArea)
- {
- EditorGUI.BeginChangeCheck();
- position = DrawPropertys(position, Prefabs, LineHeight + LineSpan);
- position = DrawButton(position, "Refresh", () => { registTargets = RefreshRegistTargets(); }, LineHeight);
- if (EditorGUI.EndChangeCheck())
- {
- registTargets = RefreshRegistTargets();
- }
- }
- if (drawRegistArea)
- {
- if (Instance.LabelScript == null && Instance.ComponentScript == null)
- {
- position = DrawButton(position, "Create And Regist", () =>
- {
- LabelUtility.CreateLabelScript(Instance, false, true);
- LabelUtility.CreateComponentScript(Instance, false, true);
- });
- }
- if (Instance.LabelScript == null)
- {
- position = DrawButton(position, "Create Label Script", () => { LabelUtility.CreateLabelScript(Instance); });
- }
- if (Instance.ComponentScript == null)
- {
- position = DrawButton(position, "Create Component Script", () => { LabelUtility.CreateComponentScript(Instance); });
- }
- }
- else if (drawLabelArea)
- {
- if (Instance.LabelScript == null)
- {
- position = DrawButton(position, "Create Label Script", () => { LabelUtility.CreateLabelScript(Instance); });
- }
- }
- if (drawRegistArea)
- {
- EditorGUI.BeginChangeCheck();
- position = DrawPropertys(position, Types, LineHeight + LineSpan);
- if (EditorGUI.EndChangeCheck())
- {
- registTargets = RefreshRegistTargets();
- }
- position = DrawPropertys(position, RegistTargets, (LineHeight + LineSpan)*6);
- position = DrawButton(position, "Create Components From Prefab", () => { LabelUtility.CreateComponentsFromPrefab(Instance); });
- }
- if (drawXmlArea)
- {
- position = DrawButton(position, "Create Label From LanguageXml", () => { LabelUtility.CreateLabelFromLanguageXml(Instance); }); //todo Ôö¼Ó
- }
- else if (drawLabelArea)
- {
- position = DrawButton(position, "Create Label From Prefab", () => { LabelUtility.CreateLabelFromPrefab(Instance); });
- }
- }
- Instance.TotalHeight = position.y - originY;
- }
- private List<RegistTarget> RefreshRegistTargets()
- {
- RegistTargetsChangeFlag = true;
- List<GameObject> prefabs = new List<GameObject>();
- for (int i = 0; i < Prefabs.arraySize; i++)
- {
- UnityEngine.Object obj = Prefabs.GetArrayElementAtIndex(i).objectReferenceValue;
- if (obj == null) continue;
- GameObject go = (GameObject) obj;
- if (prefabs.Contains(go)) continue;
- prefabs.Add(go);
- }
- List<ComponentType> componentTypes = new List<ComponentType>();
- for (int i = 0; i < Types.arraySize; i++)
- {
- ComponentType componentType = (ComponentType) Types.GetArrayElementAtIndex(i).enumValueIndex;
- if (componentType == ComponentType.None) continue;
- if (componentTypes.Contains(componentType)) continue;
- componentTypes.Add(componentType);
- }
- List<Type> types = GetTypes(componentTypes);
- List<RegistTarget> registTargets = new List<RegistTarget>();
- for (int i = 0; i < types.Count; i++)
- {
- foreach (var prefab in prefabs)
- {
- if (prefab == null) continue;
- foreach (var transform in prefab.GetComponentsInChildren<Transform>(true))
- {
- Component component = transform.GetComponent(types[i]);
- if (component == null) continue;
- RegistTarget registTarget = GetRegistTarget(transform, componentTypes[i]);
- if (registTarget == null)
- {
- registTarget = new RegistTarget();
- registTarget.Transform = transform;
- registTarget.Type = componentTypes[i];
- registTarget.Name = string.IsNullOrEmpty(Instance.NameExcludeString) ? $"{transform.name}" : $"{transform.name.Replace(Instance.NameExcludeString, "")}";
- }
- registTargets.Add(registTarget);
- }
- }
- }
- //foreach (var registTarget in registTargets)
- //{
- // Debug.Log($"{registTarget.Type} {registTarget.Name}");
- //}
- registTargets.AddRange(GetForceRegistTargets());
- return registTargets;
- }
- private RegistTarget GetRegistTarget(Transform transform, ComponentType type)
- {
- foreach (var registTarget in Instance.RegistTargets)
- {
- if (registTarget.Transform == transform && registTarget.Type == type)
- {
- return registTarget;
- }
- }
- return null;
- }
- private List<RegistTarget> GetForceRegistTargets()
- {
- List<RegistTarget> tempRegistTargets = new List<RegistTarget>();
- foreach (var registTarget in Instance.RegistTargets)
- {
- if (registTarget.Force)
- {
- tempRegistTargets.Add(registTarget);
- }
- }
- return tempRegistTargets;
- }
- private List<Type> GetTypes(List<ComponentType> componentTypes)
- {
- List<Type> types = new List<Type>();
- foreach (var componentType in componentTypes)
- {
- types.Add(LabelUtility.GetType(componentType));
- }
- return types;
- }
- private Rect DrawButton(Rect position, string name, Action OnClick, float? buttonHeight = null)
- {
- Rect contentPosition = position;
- contentPosition.height = buttonHeight ?? ButtonHeight;
- if (GUI.Button(contentPosition, name))
- {
- OnClick.Invoke();
- }
- position.y += ButtonHeight + ButtonSpan;
- return position;
- }
- private Rect DrawProperty(Rect position, SerializedProperty property)
- {
- Rect contentPosition = position;
- contentPosition.height = LineHeight;
- contentPosition = EditorGUI.PrefixLabel(contentPosition, new GUIContent(property.displayName));
- EditorGUI.PropertyField(contentPosition, property, GUIContent.none);
- position.y += LineHeight + LineSpan;
- return position;
- }
- private Rect DrawPropertys(Rect position, SerializedProperty property, float itemHeight)
- {
- Rect contentPosition = position;
- contentPosition.height = LineHeight;
- contentPosition = EditorGUI.PrefixLabel(contentPosition, new GUIContent(property.displayName));
- EditorGUI.PropertyField(contentPosition, property, GUIContent.none, true);
- if (property.isExpanded)
- {
- position.y += itemHeight * property.arraySize + (LineHeight + LineSpan)*2;
- }
- else
- {
- position.y += LineHeight + LineSpan;
- }
- return position;
- }
- }
- }
|