설명 없음
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

TilemapEditorToolPreferences.cs 14KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343
  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using UnityEditor.EditorTools;
  5. using UnityEditorInternal;
  6. using UnityEngine;
  7. using Object = UnityEngine.Object;
  8. namespace UnityEditor.Tilemaps
  9. {
  10. internal class TilemapEditorToolPreferences : ScriptableSingleton<TilemapEditorToolPreferences>
  11. {
  12. private static readonly string s_LibraryFolderPath = "Library/GridBrush";
  13. private static readonly string s_AssetPath = FileUtil.CombinePaths(s_LibraryFolderPath, "TilemapEditorToolPreferences.asset");
  14. internal class TilemapEditorToolProperties
  15. {
  16. public static readonly string defaultToolsEditorPref = "TilemapEditorTool.DefaultTools";
  17. public static readonly GUIContent defaultToolsLabel = EditorGUIUtility.TrTextContent("Default Tile Palette Tools");
  18. public static readonly GUIContent addLabel = EditorGUIUtility.TrTextContent("+", "Add to Defaults");
  19. public static readonly GUIContent removeLabel = EditorGUIUtility.TrTextContent("-", "Remove from Defaults");
  20. public static readonly GUIContent saveLabel = EditorGUIUtility.TrTextContent("Save", "Save Defaults");
  21. public static readonly GUIContent revertLabel = EditorGUIUtility.TrTextContent("Revert", "Revert Changes");
  22. public static readonly GUIContent resetLabel = EditorGUIUtility.TrTextContent("Reset", "Reset Defaults");
  23. }
  24. internal static void PreferencesGUI()
  25. {
  26. using (new SettingsWindow.GUIScope())
  27. {
  28. instance.DoPreferencesGUI();
  29. }
  30. }
  31. internal static EditorTool[] CreateDefaultTilePaletteEditorTools()
  32. {
  33. return instance.CreateDefaultTilemapEditorTools();
  34. }
  35. private ReorderableList m_DefaultTypes;
  36. private ReorderableList m_OtherTypes;
  37. private bool m_Changed;
  38. private HashSet<Type> m_AllTilemapEditorToolTypes;
  39. private List<DefaultTilemapEditorTool> m_DefaultTilemapEditorToolTypes;
  40. private List<DefaultTilemapEditorTool> m_OtherTilemapEditorToolTypes;
  41. private static EditorTool[] s_DefaultTilemapEditorTools;
  42. private void OnEnable()
  43. {
  44. m_DefaultTilemapEditorToolTypes = new List<DefaultTilemapEditorTool>();
  45. m_OtherTilemapEditorToolTypes = new List<DefaultTilemapEditorTool>();
  46. LoadDefaultEditorToolTypes();
  47. m_DefaultTypes = new ReorderableList(m_DefaultTilemapEditorToolTypes, typeof(DefaultTilemapEditorTool), true, false, false, false);
  48. m_DefaultTypes.drawElementCallback = OnDrawDefaultElement;
  49. m_DefaultTypes.onReorderCallback = OnReorderDefaultElement;
  50. m_OtherTypes = new ReorderableList(m_OtherTilemapEditorToolTypes, typeof(DefaultTilemapEditorTool), true, false, false, false);
  51. m_OtherTypes.drawElementCallback = OnDrawOtherElement;
  52. m_Changed = false;
  53. }
  54. private void InitializeAllTilemapEditorToolTypes()
  55. {
  56. m_AllTilemapEditorToolTypes = new HashSet<Type>();
  57. foreach (var tilemapEditorToolType in TypeCache.GetTypesDerivedFrom(typeof(TilemapEditorTool)))
  58. {
  59. if (tilemapEditorToolType.IsAbstract)
  60. continue;
  61. m_AllTilemapEditorToolTypes.Add(tilemapEditorToolType);
  62. }
  63. }
  64. internal void LoadDefaultEditorToolTypes()
  65. {
  66. InitializeAllTilemapEditorToolTypes();
  67. m_DefaultTilemapEditorToolTypes.Clear();
  68. m_OtherTilemapEditorToolTypes.Clear();
  69. var defaultTools = LoadTilemapEditorToolPreferencesAsset();
  70. if (defaultTools == null || defaultTools.Count == 0)
  71. {
  72. foreach (var type in TilemapEditorTool.s_DefaultToolTypes)
  73. {
  74. m_DefaultTilemapEditorToolTypes.Add(new DefaultTilemapEditorTool { fullTypeName = type.FullName, tilemapEditorToolType = type });
  75. }
  76. }
  77. else
  78. {
  79. foreach (var defaultTool in defaultTools)
  80. {
  81. if (!String.IsNullOrWhiteSpace(defaultTool.fullTypeName))
  82. {
  83. Type toolType = null;
  84. foreach (var type in m_AllTilemapEditorToolTypes)
  85. {
  86. if (type.FullName == defaultTool.fullTypeName)
  87. {
  88. toolType = type;
  89. break;
  90. }
  91. }
  92. m_DefaultTilemapEditorToolTypes.Add(new DefaultTilemapEditorTool { fullTypeName = defaultTool.fullTypeName, tilemapEditorToolType = toolType });
  93. }
  94. }
  95. }
  96. HashSet<Type> otherTypes = new HashSet<Type>(m_AllTilemapEditorToolTypes);
  97. foreach (var defaultType in m_DefaultTilemapEditorToolTypes)
  98. {
  99. if (defaultType.tilemapEditorToolType != null)
  100. otherTypes.Remove(defaultType.tilemapEditorToolType);
  101. }
  102. foreach (var otherType in otherTypes)
  103. {
  104. m_OtherTilemapEditorToolTypes.Add(new DefaultTilemapEditorTool
  105. {fullTypeName = otherType.FullName, tilemapEditorToolType = otherType});
  106. }
  107. }
  108. private EditorTool[] CreateDefaultTilemapEditorTools()
  109. {
  110. if (m_DefaultTilemapEditorToolTypes == null)
  111. LoadDefaultEditorToolTypes();
  112. // Create Tools based on the user's preferences
  113. List<EditorTool> editorTools = new List<EditorTool>();
  114. foreach (var defaultTool in m_DefaultTilemapEditorToolTypes)
  115. {
  116. if (defaultTool.tilemapEditorToolType != null)
  117. {
  118. var tool = ScriptableObject.CreateInstance(defaultTool.tilemapEditorToolType) as EditorTool;
  119. if (tool != null)
  120. editorTools.Add(tool);
  121. }
  122. }
  123. // Ensure that there are always tools for the Tile Palette
  124. if (editorTools.Count == 0)
  125. {
  126. foreach (var defaultToolType in TilemapEditorTool.s_DefaultToolTypes)
  127. {
  128. editorTools.Add(ScriptableObject.CreateInstance(defaultToolType) as EditorTool);
  129. }
  130. }
  131. s_DefaultTilemapEditorTools = editorTools.ToArray();
  132. return s_DefaultTilemapEditorTools;
  133. }
  134. internal void ClearExistingDefaultTilemapEditorTools()
  135. {
  136. if (s_DefaultTilemapEditorTools == null)
  137. return;
  138. for (int i = 0; i < s_DefaultTilemapEditorTools.Length; ++i)
  139. {
  140. s_DefaultTilemapEditorTools[i] = null;
  141. }
  142. }
  143. private void OnDrawDefaultElement(Rect rect, int i, bool isactive, bool isfocused)
  144. {
  145. if (i < 0 || i >= m_DefaultTilemapEditorToolTypes.Count)
  146. return;
  147. var type = m_DefaultTilemapEditorToolTypes[i];
  148. DoDrawElement(rect, type);
  149. }
  150. private void OnDrawOtherElement(Rect rect, int i, bool isactive, bool isfocused)
  151. {
  152. if (i < 0 || i >= m_OtherTilemapEditorToolTypes.Count)
  153. return;
  154. var type = m_OtherTilemapEditorToolTypes[i];
  155. DoDrawElement(rect, type);
  156. }
  157. private void DoDrawElement(Rect rect, DefaultTilemapEditorTool defaultType)
  158. {
  159. if (defaultType.tilemapEditorToolType == null)
  160. {
  161. EditorGUI.LabelField(rect, GUIContent.Temp(String.Format("[{0}] {1}", "Invalid", defaultType.fullTypeName)));
  162. }
  163. else
  164. {
  165. if (defaultType.toolInstance == null)
  166. defaultType.toolInstance = (TilemapEditorTool)ScriptableObject.CreateInstance(defaultType.tilemapEditorToolType);
  167. if (defaultType.toolInstance != null && defaultType.toolInstance.toolbarIcon != null)
  168. {
  169. EditorGUI.LabelField(rect, defaultType.toolInstance.toolbarIcon);
  170. var size = GUI.skin.label.CalcSize(defaultType.toolInstance.toolbarIcon);
  171. rect.xMin += size.x;
  172. }
  173. EditorGUI.LabelField(rect, GUIContent.Temp(defaultType.tilemapEditorToolType.Name, defaultType.tilemapEditorToolType.FullName));
  174. }
  175. }
  176. private void OnReorderDefaultElement(ReorderableList list)
  177. {
  178. m_Changed = true;
  179. }
  180. private void DoPreferencesGUI()
  181. {
  182. if (m_DefaultTypes == null)
  183. LoadDefaultEditorToolTypes();
  184. EditorGUILayout.LabelField(TilemapEditorToolProperties.defaultToolsLabel);
  185. EditorGUILayout.BeginHorizontal();
  186. m_DefaultTypes.DoLayoutList();
  187. EditorGUILayout.BeginVertical();
  188. if (GUILayout.Button(TilemapEditorToolProperties.addLabel))
  189. {
  190. var otherIndex = m_OtherTypes.index;
  191. if (0 <= otherIndex && otherIndex < m_OtherTilemapEditorToolTypes.Count)
  192. {
  193. var otherType = m_OtherTilemapEditorToolTypes[otherIndex];
  194. var defaultIndex = m_DefaultTypes.index;
  195. m_DefaultTilemapEditorToolTypes.Insert(defaultIndex + 1, otherType);
  196. m_OtherTilemapEditorToolTypes.RemoveAt(otherIndex);
  197. m_DefaultTypes.index = defaultIndex + 1;
  198. m_OtherTypes.index = -1;
  199. m_Changed = true;
  200. }
  201. }
  202. if (GUILayout.Button(TilemapEditorToolProperties.removeLabel))
  203. {
  204. var defaultIndex = m_DefaultTypes.index;
  205. if (0 <= defaultIndex && defaultIndex < m_DefaultTilemapEditorToolTypes.Count)
  206. {
  207. var defaultType = m_DefaultTilemapEditorToolTypes[defaultIndex];
  208. if (defaultType.tilemapEditorToolType != null)
  209. {
  210. var otherIndex = m_OtherTypes.index;
  211. m_OtherTilemapEditorToolTypes.Insert(otherIndex + 1, defaultType);
  212. m_OtherTypes.index = otherIndex + 1;
  213. }
  214. m_DefaultTilemapEditorToolTypes.RemoveAt(defaultIndex);
  215. m_DefaultTypes.index = -1;
  216. m_Changed = true;
  217. }
  218. }
  219. EditorGUILayout.EndVertical();
  220. m_OtherTypes.DoLayoutList();
  221. EditorGUILayout.EndHorizontal();
  222. EditorGUILayout.BeginHorizontal();
  223. using (new EditorGUI.DisabledScope(!m_Changed))
  224. {
  225. if (GUILayout.Button(TilemapEditorToolProperties.saveLabel))
  226. {
  227. SaveTilemapEditorToolPreferencesAsset(m_DefaultTilemapEditorToolTypes);
  228. ClearExistingDefaultTilemapEditorTools();
  229. m_Changed = false;
  230. GridPaintingState.RepaintGridPaintPaletteWindow();
  231. }
  232. if (GUILayout.Button(TilemapEditorToolProperties.revertLabel))
  233. {
  234. LoadDefaultEditorToolTypes();
  235. m_DefaultTypes.index = -1;
  236. m_OtherTypes.index = -1;
  237. m_Changed = false;
  238. }
  239. }
  240. if (GUILayout.Button(TilemapEditorToolProperties.resetLabel))
  241. {
  242. DeleteTilemapEditorToolPreferencesAsset();
  243. ClearExistingDefaultTilemapEditorTools();
  244. LoadDefaultEditorToolTypes();
  245. m_DefaultTypes.index = -1;
  246. m_OtherTypes.index = -1;
  247. m_Changed = false;
  248. GridPaintingState.RepaintGridPaintPaletteWindow();
  249. }
  250. EditorGUILayout.EndHorizontal();
  251. }
  252. internal void DeleteTilemapEditorToolPreferencesAsset()
  253. {
  254. if (File.Exists(s_AssetPath))
  255. {
  256. FileUtil.DeleteFileOrDirectory(s_AssetPath);
  257. }
  258. }
  259. internal void SaveTilemapEditorToolPreferencesAsset(List<DefaultTilemapEditorTool> defaultTools)
  260. {
  261. if (defaultTools == null)
  262. return;
  263. foreach (var defaultTool in defaultTools)
  264. {
  265. if (defaultTool.tilemapEditorToolType != null &&
  266. !(defaultTool.tilemapEditorToolType.IsSubclassOf(typeof(TilemapEditorTool))))
  267. {
  268. return;
  269. }
  270. }
  271. if (!Directory.Exists(s_LibraryFolderPath))
  272. {
  273. Directory.CreateDirectory(s_LibraryFolderPath);
  274. }
  275. var saveAsset = ScriptableObject.CreateInstance<TilemapEditorToolPreferencesAsset>();
  276. saveAsset.m_UserDefaultTools = defaultTools;
  277. InternalEditorUtility.SaveToSerializedFileAndForget(new Object[] { saveAsset }, s_AssetPath, true);
  278. }
  279. internal List<DefaultTilemapEditorTool> LoadTilemapEditorToolPreferencesAsset()
  280. {
  281. if (!File.Exists(s_AssetPath))
  282. return null;
  283. var serializedObjects = InternalEditorUtility.LoadSerializedFileAndForget(s_AssetPath);
  284. if (serializedObjects != null && serializedObjects.Length > 0)
  285. {
  286. var defaultTools = serializedObjects[0] as TilemapEditorToolPreferencesAsset;
  287. if (defaultTools != null)
  288. return defaultTools.m_UserDefaultTools;
  289. }
  290. return null;
  291. }
  292. }
  293. }