ProjectExporterSettingsProvider.cs 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. using System.Collections.Generic;
  2. using AssetBank.Editor.DockableWindow;
  3. using UnityEditor;
  4. using UnityEngine;
  5. namespace AssetBank.Settings
  6. {
  7. internal class ProjectExporterSettingsProvider : SettingsProvider
  8. {
  9. private SerializedObject m_Settings;
  10. private SerializedProperty m_FoldersToIgnore;
  11. private SerializedProperty m_FileExtensionsToIgnore;
  12. private SerializedProperty m_UnityTypesToIgnore;
  13. private SerializedProperty m_OptimiseExport;
  14. private SerializedProperty m_CategoriesToOptimise;
  15. private SerializedProperty m_SafeComponents;
  16. private SerializedProperty m_HardcodedComponents;
  17. private SerializedProperty m_OverrideHardcodedDefaults;
  18. const string k_SettingsPath = "Project/Project AssetDatabase";
  19. public ProjectExporterSettingsProvider(string path, SettingsScope scope = SettingsScope.Project)
  20. : base(path, scope) {}
  21. public override void OnActivate(string searchContext, UnityEngine.UIElements.VisualElement rootElement)
  22. {
  23. m_Settings = ProjectExporterSettings.GetSerializedSettings();
  24. m_FoldersToIgnore = m_Settings.FindProperty("m_FoldersToIgnore");
  25. m_FileExtensionsToIgnore = m_Settings.FindProperty("m_FileExtensionsToIgnore");
  26. m_UnityTypesToIgnore = m_Settings.FindProperty("m_UnityTypesToIgnore");
  27. m_OptimiseExport = m_Settings.FindProperty("m_OptimiseExport");
  28. m_CategoriesToOptimise = m_Settings.FindProperty("m_CategoriesToOptimise");
  29. m_SafeComponents = m_Settings.FindProperty("m_SafeComponents");
  30. m_HardcodedComponents = m_Settings.FindProperty("m_HardcodedComponents");
  31. m_OverrideHardcodedDefaults = m_Settings.FindProperty("m_OverrideHardcodedDefaults");
  32. }
  33. public override void OnGUI(string searchContext)
  34. {
  35. if (m_Settings == null || m_Settings.targetObject == null)
  36. {
  37. EditorGUILayout.HelpBox("Settings asset not found. It will be created automatically.", MessageType.Info);
  38. m_Settings = ProjectExporterSettings.GetSerializedSettings();
  39. return;
  40. }
  41. m_Settings.Update();
  42. EditorGUILayout.PropertyField(m_FoldersToIgnore, new GUIContent("Folders to Ignore"), true);
  43. EditorGUILayout.PropertyField(m_FileExtensionsToIgnore, new GUIContent("File Extensions to Ignore"), true);
  44. EditorGUILayout.PropertyField(m_UnityTypesToIgnore, new GUIContent("Unity Types to Ignore"), true);
  45. EditorGUILayout.Space();
  46. EditorGUILayout.PropertyField(m_OptimiseExport, new GUIContent("Optimise Export"));
  47. if(m_OptimiseExport.boolValue)
  48. {
  49. DrawCategoriesToOptimise();
  50. EditorGUILayout.Space();
  51. EditorGUILayout.LabelField("Hardcoded Rules", EditorStyles.boldLabel);
  52. EditorGUILayout.PropertyField(m_OverrideHardcodedDefaults, new GUIContent("Override Defaults", "Check this to ignore the hardcoded safety rules and use only the 'Safe Components' list below. Warning: This can break scene hierarchy if not configured correctly."));
  53. EditorGUI.BeginDisabledGroup(true);
  54. EditorGUILayout.PropertyField(m_HardcodedComponents, new GUIContent("Hardcoded Safe Components (Read-Only)"), true);
  55. EditorGUI.EndDisabledGroup();
  56. EditorGUILayout.Space();
  57. EditorGUILayout.LabelField("User-Defined Rules", EditorStyles.boldLabel);
  58. EditorGUILayout.PropertyField(m_SafeComponents, new GUIContent("Safe Components"), true);
  59. }
  60. if (m_Settings.hasModifiedProperties)
  61. {
  62. m_Settings.ApplyModifiedProperties();
  63. }
  64. }
  65. private void DrawCategoriesToOptimise()
  66. {
  67. EditorGUILayout.LabelField("Categories to Optimise", EditorStyles.boldLabel);
  68. EditorGUI.indentLevel++;
  69. var categories = new List<string>();
  70. for (int i = 0; i < m_CategoriesToOptimise.arraySize; i++)
  71. {
  72. categories.Add(m_CategoriesToOptimise.GetArrayElementAtIndex(i).stringValue);
  73. }
  74. foreach (var availableCategory in ProjectExporterCategories.All)
  75. {
  76. var isEnabled = categories.Contains(availableCategory);
  77. var newIsEnabled = EditorGUILayout.Toggle(availableCategory, isEnabled);
  78. if (newIsEnabled && !isEnabled)
  79. {
  80. // Add to list
  81. var index = m_CategoriesToOptimise.arraySize;
  82. m_CategoriesToOptimise.InsertArrayElementAtIndex(index);
  83. m_CategoriesToOptimise.GetArrayElementAtIndex(index).stringValue = availableCategory;
  84. }
  85. else if (!newIsEnabled && isEnabled)
  86. {
  87. // Remove from list
  88. for (int i = 0; i < m_CategoriesToOptimise.arraySize; i++)
  89. {
  90. if (m_CategoriesToOptimise.GetArrayElementAtIndex(i).stringValue == availableCategory)
  91. {
  92. m_CategoriesToOptimise.DeleteArrayElementAtIndex(i);
  93. break;
  94. }
  95. }
  96. }
  97. }
  98. EditorGUI.indentLevel--;
  99. }
  100. [SettingsProvider]
  101. public static SettingsProvider CreateSettingsProvider()
  102. {
  103. var provider = new ProjectExporterSettingsProvider(k_SettingsPath, SettingsScope.Project)
  104. {
  105. keywords = GetSearchKeywordsFromGUIContentProperties<Styles>()
  106. };
  107. return provider;
  108. }
  109. private class Styles
  110. {
  111. public static GUIContent foldersToIgnore = new GUIContent("Folders to Ignore");
  112. public static GUIContent fileExtensionsToIgnore = new GUIContent("File Extensions to Ignore");
  113. public static GUIContent unityTypesToIgnore = new GUIContent("Unity Types to Ignore");
  114. public static GUIContent optimiseExport = new GUIContent("Optimise Export");
  115. public static GUIContent safeComponents = new GUIContent("Safe Components");
  116. }
  117. }
  118. }