LabelSetDrawer.cs 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356
  1. using System.Reflection;
  2. namespace labelUtility
  3. {
  4. using System;
  5. using System.Collections;
  6. using System.Collections.Generic;
  7. using UnityEditor;
  8. using UnityEngine;
  9. [CustomPropertyDrawer(typeof(LabelSet))]
  10. public class LabelSetDrawer : PropertyDrawer
  11. {
  12. #region Config
  13. private float LineSpan = 2;
  14. private float LineHeight = 16;
  15. private float ButtonSpan = 4;
  16. private float ButtonHeight = 32;
  17. private LabelSet Instance;
  18. private SerializedProperty Name;
  19. private SerializedProperty UtilityType;
  20. private SerializedProperty LabelScriptPath;
  21. private SerializedProperty LabelScriptName;
  22. private SerializedProperty LabePrefix;
  23. private SerializedProperty LabelScript;
  24. private SerializedProperty ComponentScriptPath;
  25. private SerializedProperty ComponentScriptName;
  26. private SerializedProperty DerivedString;
  27. private SerializedProperty RegistMethodString;
  28. private SerializedProperty ComponentPrefix;
  29. private SerializedProperty NameExcludeString;
  30. private SerializedProperty RegistString;
  31. private SerializedProperty RegistExtraLines;
  32. private SerializedProperty ComponentScript;
  33. private SerializedProperty Languages;
  34. private SerializedProperty Prefabs;
  35. private SerializedProperty Types;
  36. private SerializedProperty RegistTargets;
  37. private bool RegistTargetsChangeFlag;
  38. private List<RegistTarget> registTargets = new List<RegistTarget>();
  39. #endregion
  40. public override float GetPropertyHeight(SerializedProperty property, GUIContent label)
  41. {
  42. Instance = (LabelSet) InstanceUtility.GetObject(fieldInfo, property);
  43. return Instance.TotalHeight;
  44. }
  45. public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)
  46. {
  47. Instance = (LabelSet) InstanceUtility.GetObject(fieldInfo, property);
  48. Name = property.FindPropertyRelative("Name");
  49. UtilityType = property.FindPropertyRelative("UtilityType");
  50. LabelScriptPath = property.FindPropertyRelative("LabelScriptPath");
  51. LabelScriptName = property.FindPropertyRelative("LabelScriptName");
  52. LabePrefix = property.FindPropertyRelative("LabePrefix");
  53. LabelScript = property.FindPropertyRelative("LabelScript");
  54. ComponentScriptPath = property.FindPropertyRelative("ComponentScriptPath");
  55. ComponentScriptName = property.FindPropertyRelative("ComponentScriptName");
  56. DerivedString = property.FindPropertyRelative("DerivedString");
  57. RegistMethodString = property.FindPropertyRelative("RegistMethodString");
  58. ComponentPrefix = property.FindPropertyRelative("ComponentPrefix");
  59. NameExcludeString = property.FindPropertyRelative("NameExcludeString");
  60. RegistString = property.FindPropertyRelative("RegistString");
  61. RegistExtraLines = property.FindPropertyRelative("RegistExtraLines");
  62. ComponentScript = property.FindPropertyRelative("ComponentScript");
  63. Languages = property.FindPropertyRelative("Languages");
  64. Prefabs = property.FindPropertyRelative("Prefabs");
  65. Types = property.FindPropertyRelative("RegistTypes");
  66. RegistTargets = property.FindPropertyRelative("RegistTargets");
  67. if (RegistTargetsChangeFlag)
  68. {
  69. if (Instance.RegistTargets == registTargets)
  70. {
  71. RegistTargetsChangeFlag = false;
  72. }
  73. else
  74. {
  75. Instance.RegistTargets = registTargets;
  76. }
  77. }
  78. float originY = position.y;
  79. position.height = LineHeight;
  80. Instance.FoldOut = EditorGUI.Foldout(position, Instance.FoldOut, new GUIContent(Instance.Name));
  81. position.y += LineHeight + LineSpan;
  82. if (Instance.FoldOut)
  83. {
  84. EditorGUI.indentLevel++;
  85. position = DrawProperty(position, Name);
  86. position = DrawProperty(position, UtilityType);
  87. bool drawRegistArea = Instance.UtilityType == labelUtility.UtilityType.Regist;
  88. bool drawXmlArea = Instance.UtilityType == labelUtility.UtilityType.XmlLabel;
  89. bool drawLabelArea = Instance.UtilityType == labelUtility.UtilityType.Regist || Instance.UtilityType == labelUtility.UtilityType.XmlLabel || Instance.UtilityType == labelUtility.UtilityType.PrefabLabel;
  90. if (drawLabelArea)
  91. {
  92. if (Instance.LabelScript == null)
  93. {
  94. position = DrawProperty(position, LabelScriptPath);
  95. position = DrawProperty(position, LabelScriptName);
  96. position = DrawProperty(position, LabePrefix);
  97. }
  98. position = DrawProperty(position, LabelScript);
  99. }
  100. if (drawRegistArea)
  101. {
  102. if (Instance.ComponentScript == null)
  103. {
  104. position = DrawProperty(position, ComponentScriptPath);
  105. position = DrawProperty(position, ComponentScriptName);
  106. position = DrawProperty(position, DerivedString);
  107. position = DrawProperty(position, RegistMethodString);
  108. }
  109. position = DrawProperty(position, ComponentScript);
  110. position = DrawProperty(position, ComponentPrefix);
  111. position = DrawProperty(position, NameExcludeString);
  112. position = DrawProperty(position, RegistString);
  113. position = DrawPropertys(position, RegistExtraLines, LineHeight + LineSpan);
  114. }
  115. if (drawXmlArea)
  116. {
  117. position = DrawPropertys(position, Languages, LineHeight + LineSpan);
  118. }
  119. else if (drawLabelArea)
  120. {
  121. EditorGUI.BeginChangeCheck();
  122. position = DrawPropertys(position, Prefabs, LineHeight + LineSpan);
  123. if (EditorGUI.EndChangeCheck())
  124. {
  125. OnRefresh();
  126. }
  127. position = DrawButton(position, "Refresh", OnRefresh, LineHeight);
  128. }
  129. if (drawRegistArea)
  130. {
  131. if (Instance.LabelScript == null && Instance.ComponentScript == null)
  132. {
  133. position = DrawButton(position, "Create And Regist", () =>
  134. {
  135. LabelUtility.CreateLabelScript(Instance, false, true);
  136. LabelUtility.CreateComponentScript(Instance, false, true);
  137. });
  138. }
  139. if (Instance.LabelScript == null)
  140. {
  141. position = DrawButton(position, "Create Label Script", () => { LabelUtility.CreateLabelScript(Instance); });
  142. }
  143. if (Instance.ComponentScript == null)
  144. {
  145. position = DrawButton(position, "Create Component Script", () => { LabelUtility.CreateComponentScript(Instance); });
  146. }
  147. }
  148. else if (drawLabelArea)
  149. {
  150. if (Instance.LabelScript == null)
  151. {
  152. position = DrawButton(position, "Create Label Script", () => { LabelUtility.CreateLabelScript(Instance); });
  153. }
  154. }
  155. if (drawRegistArea)
  156. {
  157. EditorGUI.BeginChangeCheck();
  158. position = DrawPropertys(position, Types, LineHeight + LineSpan);
  159. if (EditorGUI.EndChangeCheck())
  160. {
  161. OnRefresh();
  162. }
  163. position = DrawPropertys(position, RegistTargets, (LineHeight + LineSpan)*7);
  164. position = DrawButton(position, "Create Components From Prefab", () => { LabelUtility.CreateComponentsFromPrefab(Instance); });
  165. }
  166. if (drawXmlArea)
  167. {
  168. position = DrawButton(position, "Create Label From LanguageXml", () => { LabelUtility.CreateLabelFromLanguageXml(Instance); });
  169. }
  170. else if (drawLabelArea)
  171. {
  172. position = DrawButton(position, "Create Label From Prefab", () => { LabelUtility.CreateLabelFromPrefab(Instance); });
  173. }
  174. }
  175. Instance.TotalHeight = position.y - originY;
  176. }
  177. private void OnRefresh()
  178. {
  179. //for (int i = 0; i < Instance.RegistTargets.Count; i++)
  180. //{
  181. // Debug.Log(Instance.RegistTargets[i].Transform.name + " " + Instance.RegistTargets[i].Type);
  182. //}
  183. RegistTargetsChangeFlag = true;
  184. registTargets = RefreshRegistTargets();
  185. }
  186. private List<RegistTarget> RefreshRegistTargets()
  187. {
  188. List<GameObject> prefabs = new List<GameObject>();
  189. for (int i = 0; i < Prefabs.arraySize; i++)
  190. {
  191. UnityEngine.Object obj = Prefabs.GetArrayElementAtIndex(i).objectReferenceValue;
  192. if (obj == null) continue;
  193. GameObject go = (GameObject) obj;
  194. if (prefabs.Contains(go)) continue;
  195. prefabs.Add(go);
  196. }
  197. List<ComponentType> componentTypes = new List<ComponentType>();
  198. for (int i = 0; i < Types.arraySize; i++)
  199. {
  200. ComponentType componentType = (ComponentType) Types.GetArrayElementAtIndex(i).enumValueIndex;
  201. if (componentType == ComponentType.None) continue;
  202. if (componentTypes.Contains(componentType)) continue;
  203. componentTypes.Add(componentType);
  204. }
  205. List<Type> types = GetTypes(componentTypes);
  206. //foreach (var VARIABLE in Instance.RegistTargets)
  207. //{
  208. // Debug.Log(VARIABLE.Transform.name + " " + VARIABLE.Transform.GetSiblingIndex());
  209. //}
  210. List<RegistTarget> registTargets = new List<RegistTarget>();
  211. for (int i = 0; i < types.Count; i++)
  212. {
  213. foreach (var prefab in prefabs)
  214. {
  215. if (prefab == null) continue;
  216. foreach (var transform in prefab.GetComponentsInChildren<Transform>(true))
  217. {
  218. Component component = transform.GetComponent(types[i]);
  219. if (component == null) continue;
  220. RegistTarget registTarget = GetRegistTarget(transform, componentTypes[i]);
  221. if (registTarget == null)
  222. {
  223. registTarget = new RegistTarget();
  224. registTarget.Transform = transform;
  225. registTarget.Type = componentTypes[i];
  226. registTarget.Name = string.IsNullOrEmpty(Instance.NameExcludeString) ? $"{transform.name}" : $"{transform.name.Replace(Instance.NameExcludeString, "")}";
  227. }
  228. registTargets.Add(registTarget);
  229. }
  230. }
  231. }
  232. //foreach (var registTarget in registTargets)
  233. //{
  234. // Debug.Log($"{registTarget.Type} {registTarget.Name}");
  235. //}
  236. registTargets.AddRange(GetForceRegistTargets());
  237. return registTargets;
  238. }
  239. private RegistTarget GetRegistTarget(Transform transform, ComponentType type)
  240. {
  241. foreach (var registTarget in Instance.RegistTargets)
  242. {
  243. if (registTarget.Transform == null)
  244. {
  245. continue;
  246. }
  247. //if (registTarget.Transform == transform && registTarget.Type == type)
  248. //{
  249. // Debug.Log(transform.name + " " + registTarget.Transform.name);
  250. // Debug.Log(registTarget.Transform.GetSiblingIndex());
  251. // Debug.LogWarning(transform.GetSiblingIndex());
  252. //}
  253. if (registTarget.Transform == transform && registTarget.Type == type)
  254. {
  255. return registTarget;
  256. }
  257. }
  258. return null;
  259. }
  260. private List<RegistTarget> GetForceRegistTargets()
  261. {
  262. List<RegistTarget> tempRegistTargets = new List<RegistTarget>();
  263. foreach (var registTarget in Instance.RegistTargets)
  264. {
  265. if (registTarget.Force)
  266. {
  267. tempRegistTargets.Add(registTarget);
  268. }
  269. }
  270. return tempRegistTargets;
  271. }
  272. private List<Type> GetTypes(List<ComponentType> componentTypes)
  273. {
  274. List<Type> types = new List<Type>();
  275. foreach (var componentType in componentTypes)
  276. {
  277. types.Add(LabelUtility.GetType(componentType));
  278. }
  279. return types;
  280. }
  281. private Rect DrawButton(Rect position, string name, Action OnClick, float? buttonHeight = null)
  282. {
  283. Rect contentPosition = position;
  284. contentPosition.height = buttonHeight ?? ButtonHeight;
  285. if (GUI.Button(contentPosition, name))
  286. {
  287. OnClick.Invoke();
  288. }
  289. position.y += ButtonHeight + ButtonSpan;
  290. return position;
  291. }
  292. private Rect DrawProperty(Rect position, SerializedProperty property)
  293. {
  294. Rect contentPosition = position;
  295. contentPosition.height = LineHeight;
  296. contentPosition = EditorGUI.PrefixLabel(contentPosition, new GUIContent(property.displayName));
  297. EditorGUI.PropertyField(contentPosition, property, GUIContent.none);
  298. position.y += LineHeight + LineSpan;
  299. return position;
  300. }
  301. private Rect DrawPropertys(Rect position, SerializedProperty property, float itemHeight)
  302. {
  303. Rect contentPosition = position;
  304. contentPosition.height = LineHeight;
  305. contentPosition = EditorGUI.PrefixLabel(contentPosition, new GUIContent(property.displayName));
  306. EditorGUI.PropertyField(contentPosition, property, GUIContent.none, true);
  307. if (property.isExpanded)
  308. {
  309. position.y += itemHeight * property.arraySize + (LineHeight + LineSpan)*2;
  310. }
  311. else
  312. {
  313. position.y += LineHeight + LineSpan;
  314. }
  315. return position;
  316. }
  317. }
  318. }