evershade/Packages/super-tiled2unity.v2.2.0/Editor/Settings/ST2USettingsProvider.cs

384 lines
17 KiB
C#

using UnityEditor;
using UnityEditorInternal;
using UnityEngine;
using UnityEngine.UIElements;
namespace SuperTiled2Unity.Editor
{
public class ST2USettingsProvider : SettingsProvider
{
private const string k_ProjectSettingsPath = "Project/Super Tiled2Unity";
private SerializedObject m_SerializedObject;
private ReorderableList m_MaterialMatchingsList;
private ReorderableList m_PrefabReplacementList;
private bool m_ShowMaterialMatchings;
private bool m_ShowPrefabReplacements;
private bool m_ShowLayerColors;
private bool m_ApplyDefaultSettings;
public ST2USettingsProvider() : base(k_ProjectSettingsPath, SettingsScope.Project)
{
}
public override void OnActivate(string searchContext, VisualElement rootElement)
{
base.OnActivate(searchContext, rootElement);
ST2USettings.instance.SaveSettings();
m_SerializedObject = new SerializedObject(ST2USettings.instance);
// Prepare our list of material matchings
var matchings = m_SerializedObject.FindProperty(nameof(ST2USettings.m_MaterialMatchings));
m_MaterialMatchingsList = new ReorderableList(m_SerializedObject, matchings, true, false, true, true)
{
headerHeight = 0,
drawElementCallback = OnDrawMaterialMatchingElement,
};
// Prepare our list of prefab replacements
var replacements = m_SerializedObject.FindProperty(nameof(ST2USettings.m_PrefabReplacements));
m_PrefabReplacementList = new ReorderableList(m_SerializedObject, replacements, true, false, true, true)
{
headerHeight = 0,
drawElementCallback = OnDrawPrefabReplacementElement,
};
}
public override void OnGUI(string searchContext)
{
EditorGUIUtility.labelWidth = 200;
m_SerializedObject.Update();
EditorGUI.BeginChangeCheck();
using (new GuiScopedIndent())
{
DoGuiVersion();
EditorGUILayout.Space();
EditorGUILayout.Space();
DoGuiSettings();
EditorGUILayout.Space();
EditorGUILayout.Space();
DoGuiPrefabReplacements();
EditorGUILayout.Space();
EditorGUILayout.Space();
DoGuiColliders();
EditorGUILayout.Space();
EditorGUILayout.Space();
DoCustomPropertySettings();
EditorGUILayout.Space();
EditorGUILayout.Space();
EditorGUILayout.Space();
DoGuiReimportAssets();
}
if (EditorGUI.EndChangeCheck())
{
if (m_SerializedObject.ApplyModifiedProperties())
{
ST2USettings.instance.RefreshCustomObjectTypes();
ST2USettings.instance.SaveSettings();
}
}
}
public override void OnTitleBarGUI()
{
var tex = EditorGUIUtility.FindTexture("_Help");
var content = new GUIContent(tex, "Go to SuperTiled2Unity Documentation");
if (GUILayout.Button(content, EditorStyles.helpBox))
{
Application.OpenURL("https://github.com/Seanba/SuperTiled2Unity/wiki");
}
}
private void DoGuiVersion()
{
EditorGUILayout.LabelField("Version: " + SuperTiled2Unity_Config.Version);
}
private void DoGuiSettings()
{
EditorGUILayout.LabelField("Default Import Settings", EditorStyles.boldLabel);
// Pixels Per Unit
{
var ppuProperty = m_SerializedObject.FindProperty(nameof(ST2USettings.m_DefaultPixelsPerUnit));
ppuProperty.floatValue = EditorGUILayout.FloatField(SettingsContent.DefaultPixelsPerUnitContent, ppuProperty.floatValue);
ppuProperty.floatValue = Mathf.Clamp(ppuProperty.floatValue, 0.001f, 2048);
}
// Edges Per Ellipse
{
var edgesProperty = m_SerializedObject.FindProperty(nameof(ST2USettings.m_DefaultEdgesPerEllipse));
edgesProperty.intValue = EditorGUILayout.IntField(SettingsContent.DefaultEdgesPerEllipseContent, edgesProperty.intValue);
edgesProperty.intValue = Mathf.Clamp(edgesProperty.intValue, 6, 256);
}
// Default Material
{
var materialProperty = m_SerializedObject.FindProperty(nameof(ST2USettings.m_DefaultMaterial));
materialProperty.objectReferenceValue = EditorGUILayout.ObjectField(SettingsContent.DefaultMaterialContent, materialProperty.objectReferenceValue, typeof(Material), false);
EditorGUILayout.Space();
DoGuiMaterialMatchings();
EditorGUILayout.Space();
}
// Animation settings
{
var animationPrpoerty = m_SerializedObject.FindProperty(nameof(ST2USettings.m_AnimationFramerate));
EditorGUILayout.LabelField("Animation Settings", EditorStyles.boldLabel);
// Animation Framerate
animationPrpoerty.intValue = EditorGUILayout.IntField(SettingsContent.AnimationFramerateContent, animationPrpoerty.intValue);
animationPrpoerty.intValue = Mathf.Clamp(animationPrpoerty.intValue, 1, 125);
EditorGUILayout.HelpBox("In frames-per-second. Note: You will need to reimport all your tilesets after making changes to the animation framerate for tiles.", MessageType.None);
}
}
private void DoGuiMaterialMatchings()
{
EditorGUILayout.LabelField("Material Matchings", EditorStyles.boldLabel);
m_ShowMaterialMatchings = EditorGUILayout.Foldout(m_ShowMaterialMatchings, SettingsContent.MaterialMatchingsContent);
if (m_ShowMaterialMatchings)
{
m_MaterialMatchingsList.DoLayoutList();
using (new GUILayout.HorizontalScope())
{
GUILayout.FlexibleSpace();
if (GUILayout.Button("Sort Alphabetically"))
{
ST2USettings.instance.SortMaterialMatchings();
EditorUtility.SetDirty(ST2USettings.instance);
}
}
EditorGUILayout.HelpBox("Fill this out with the names of Tile Layer names and their matching materials. Any imported Tiled Layer with a matching name will use the assigned material.", MessageType.None);
}
}
private void DoGuiPrefabReplacements()
{
EditorGUILayout.LabelField("Prefab Settings", EditorStyles.boldLabel);
m_ShowPrefabReplacements = EditorGUILayout.Foldout(m_ShowPrefabReplacements, SettingsContent.PrefabReplacmentsContent);
if (m_ShowPrefabReplacements)
{
m_PrefabReplacementList.DoLayoutList();
using (new GUILayout.HorizontalScope())
{
GUILayout.FlexibleSpace();
if (GUILayout.Button("Add From Object Types Xml"))
{
ST2USettings.instance.AddObjectsToPrefabReplacements();
EditorUtility.SetDirty(ST2USettings.instance);
}
if (GUILayout.Button("Sort Alphabetically"))
{
ST2USettings.instance.SortPrefabReplacements();
EditorUtility.SetDirty(ST2USettings.instance);
}
}
EditorGUILayout.HelpBox("When the Tiled import scripts come across a Tiled Object of one of these given types it will be replaced, automatically, with the associated prefab.", MessageType.None);
}
}
private void DoGuiColliders()
{
EditorGUILayout.LabelField("Collider Settings", EditorStyles.boldLabel);
SerializedProperty geoTypeProperty = m_SerializedObject.FindProperty(nameof(ST2USettings.m_CollisionGeometryType));
geoTypeProperty.intValue = (int)(CompositeCollider2D.GeometryType)EditorGUILayout.EnumPopup(SettingsContent.CollisionGeometryTypeContent, (CompositeCollider2D.GeometryType)geoTypeProperty.intValue);
m_ShowLayerColors = EditorGUILayout.Foldout(m_ShowLayerColors, SettingsContent.LayerColorsContent);
if (m_ShowLayerColors)
{
SerializedProperty listProperty = m_SerializedObject.FindProperty(nameof(ST2USettings.m_LayerColors));
using (new GuiScopedIndent())
{
for (int i = 0; i < 32; i++)
{
string layerName = LayerMask.LayerToName(i);
if (string.IsNullOrEmpty(layerName))
{
continue;
}
// For each layer that is named give the user a change to modify its color
SerializedProperty indexProperty = listProperty.GetArrayElementAtIndex(i);
GUIContent indexPropertyContext = new GUIContent(layerName, string.Format("Select color for {0} tile layer colliders", layerName));
indexProperty.colorValue = EditorGUILayout.ColorField(indexPropertyContext, indexProperty.colorValue);
}
}
}
}
private void DoCustomPropertySettings()
{
var xmlProperty = m_SerializedObject.FindProperty(nameof(ST2USettings.m_ObjectTypesXml));
EditorGUILayout.LabelField("Custom Property Settings", EditorStyles.boldLabel);
xmlProperty.objectReferenceValue = EditorGUILayout.ObjectField(SettingsContent.ObjectTypesXmlContent, xmlProperty.objectReferenceValue, typeof(TextAsset), false);
if (!string.IsNullOrEmpty(ST2USettings.instance.m_ParseXmlError))
{
EditorGUILayout.HelpBox(ST2USettings.instance.m_ParseXmlError, MessageType.Error);
}
EditorGUILayout.Space();
using (new GUILayout.HorizontalScope())
{
GUILayout.FlexibleSpace();
if (GUILayout.Button("Refresh"))
{
ST2USettings.instance.RefreshCustomObjectTypes();
}
if (GUILayout.Button("View Custom Properties"))
{
CustomPropertiesWindow.ShowCustomPropertiesWindow();
}
}
}
private void DoGuiReimportAssets()
{
EditorGUILayout.LabelField("Reimport Assets", EditorStyles.boldLabel);
EditorGUILayout.HelpBox(@"You may want to reimport all Tiled assets after making changes to settings." +
@" Be aware this may take a few minutes if you have a lot of Tiled assets." +
@" This will force import tilesets, templates, and maps." +
@" Note that some assets may be reimported multiple times because of dependencies.",
MessageType.Info);
using (new GUILayout.HorizontalScope())
{
GUILayout.FlexibleSpace();
m_ApplyDefaultSettings = GUILayout.Toggle(m_ApplyDefaultSettings, SettingsContent.ApplyDefaultSettingsContent);
}
using (new GUILayout.HorizontalScope())
{
GUILayout.FlexibleSpace();
if (GUILayout.Button("Reimport Tiled Assets"))
{
ReimportTiledAssets(m_ApplyDefaultSettings);
}
}
}
private void OnDrawMaterialMatchingElement(Rect rect, int index, bool isActive, bool isFocused)
{
using (new GuiScopedIndent())
{
const int kMargin = 20;
float fieldWidth = (rect.width - kMargin) / 2;
var element = m_MaterialMatchingsList.serializedProperty.GetArrayElementAtIndex(index);
var nameProperty = element.FindPropertyRelative("m_LayerName");
var materialProperty = element.FindPropertyRelative("m_Material");
rect.y += 2;
nameProperty.stringValue = EditorGUI.TextField(new Rect(rect.x, rect.y, fieldWidth, EditorGUIUtility.singleLineHeight), nameProperty.stringValue);
materialProperty.objectReferenceValue = EditorGUI.ObjectField(new Rect(rect.x + fieldWidth + kMargin, rect.y, fieldWidth, EditorGUIUtility.singleLineHeight), GUIContent.none, materialProperty.objectReferenceValue, typeof(Material), false);
}
}
private void OnDrawPrefabReplacementElement(Rect rect, int index, bool isActive, bool isFocused)
{
using (new GuiScopedIndent())
{
const int kMargin = 20;
float fieldWidth = (rect.width - kMargin) / 2;
var element = m_PrefabReplacementList.serializedProperty.GetArrayElementAtIndex(index);
var nameProperty = element.FindPropertyRelative("m_TypeName");
var prefabProperty = element.FindPropertyRelative("m_Prefab");
rect.y += 2;
nameProperty.stringValue = EditorGUI.TextField(new Rect(rect.x, rect.y, fieldWidth, EditorGUIUtility.singleLineHeight), nameProperty.stringValue);
prefabProperty.objectReferenceValue = EditorGUI.ObjectField(new Rect(rect.x + fieldWidth + kMargin, rect.y, fieldWidth, EditorGUIUtility.singleLineHeight), GUIContent.none, prefabProperty.objectReferenceValue, typeof(GameObject), false);
}
}
private static void ReimportTiledAssets(bool applyDefaults)
{
if (applyDefaults)
{
foreach (var guid in AssetDatabase.FindAssets("t:SuperAsset"))
{
var path = AssetDatabase.GUIDToAssetPath(guid);
if (AssetImporter.GetAtPath(path) is TiledAssetImporter importer)
{
importer.ApplyDefaultSettings();
}
}
}
// Reimport tilesets first
foreach (var guid in AssetDatabase.FindAssets("t:SuperAssetTileset"))
{
var path = AssetDatabase.GUIDToAssetPath(guid);
AssetDatabase.ImportAsset(path, ImportAssetOptions.ForceUpdate);
}
// Then templates
foreach (var guid in AssetDatabase.FindAssets("t:SuperAssetTemplate"))
{
var path = AssetDatabase.GUIDToAssetPath(guid);
AssetDatabase.ImportAsset(path, ImportAssetOptions.ForceUpdate);
}
// Then maps
foreach (var guid in AssetDatabase.FindAssets("t:SuperAssetMap"))
{
var path = AssetDatabase.GUIDToAssetPath(guid);
AssetDatabase.ImportAsset(path, ImportAssetOptions.ForceUpdate);
}
}
[SettingsProvider]
public static SettingsProvider CreateCustomSettingsProvider()
{
var provider = new ST2USettingsProvider()
{
keywords = GetSearchKeywordsFromGUIContentProperties<SettingsContent>()
};
return provider;
}
private class SettingsContent
{
public static readonly GUIContent DefaultPixelsPerUnitContent = new GUIContent("Default Pixels Per Unit", "How many pixels in the sprite correspond to one unit in the world. (Default Setting)");
public static readonly GUIContent DefaultEdgesPerEllipseContent = new GUIContent("Default Edges Per Ellipse", "How many edges to use when appromixating ellipse/circle colliders. (Default Setting)");
public static readonly GUIContent AnimationFramerateContent = new GUIContent("Animation Framerate", "How many frames per second for tile animations.");
public static readonly GUIContent DefaultMaterialContent = new GUIContent("Default Material", "Set to the material you want to use for sprites and tiles imported by SuperTiled2Unity. Leave empy to use built-in sprite material.");
public static readonly GUIContent MaterialMatchingsContent = new GUIContent("Material Matchings", "Match these materials by Tiled Layer names.");
public static readonly GUIContent ObjectTypesXmlContent = new GUIContent("Object Types Xml", "Set to an Object Types Xml file exported from Tiled Object Type Editor.");
public static readonly GUIContent PrefabReplacmentsContent = new GUIContent("Prefab Replacements", "List of prefabs to replace Tiled Object Types during import.");
public static readonly GUIContent CollisionGeometryTypeContent = new GUIContent("Collision Geometry Type", "The type of geometry used by CompositeCollider2D components.");
public static readonly GUIContent LayerColorsContent = new GUIContent("Layer Colors", "These colors will be used for drawing colliders in your imported Tiled maps.");
public static readonly GUIContent ApplyDefaultSettingsContent = new GUIContent("Apply Default Settings", "Default Import Settings will be applied to every ST2U that is imported. Beware!");
}
}
}