using UnityEditor.U2D; using UnityEditorInternal; using UnityEngine; using UnityEngine.U2D; using UnityEngine.UIElements; namespace UnityEditor.Tilemaps { /// /// Editor for a TileSetImporter /// [CustomEditor(typeof(TileSetImporter))] public class TileSetImporterEditor : Editor { private string m_AssetPath; private TileSet m_TileSet; private SpriteAtlas m_SpriteAtlas; private SerializedObject m_SerializedTileSetObject; private SerializedObject m_SerializedSpriteAtlasObject; private TileSetImporterElement m_MainElement; private Editor m_SpriteAtlasEditor; private SerializedObject serializedTileSetObject { get { if (m_SerializedTileSetObject == null) { try { m_SerializedTileSetObject = new SerializedObject(m_TileSet); } catch (System.ArgumentException e) { m_SerializedTileSetObject = null; throw e; } } return m_SerializedTileSetObject; } } private SerializedObject serializedSpriteAtlasObject { get { if (m_SerializedSpriteAtlasObject == null) { try { m_SerializedSpriteAtlasObject = new SerializedObject(m_SpriteAtlas); } catch (System.ArgumentException e) { m_SerializedSpriteAtlasObject = null; throw e; } } return m_SerializedSpriteAtlasObject; } } private void OnEnable() { LoadTileSet(); } private void LoadTileSet() { m_AssetPath = AssetDatabase.GetAssetPath(target); var loadedObjects = InternalEditorUtility.LoadSerializedFileAndForget(m_AssetPath); foreach (var loadedObject in loadedObjects) { if (loadedObject is TileSet tileSet) m_TileSet = tileSet; if (loadedObject is SpriteAtlas spriteAtlas) m_SpriteAtlas = spriteAtlas; } if (m_SpriteAtlas == null) { m_SpriteAtlas = new SpriteAtlas(); var sats = new SpriteAtlasTextureSettings() { filterMode = FilterMode.Point, anisoLevel = 0, generateMipMaps = false, sRGB = true, }; m_SpriteAtlas.SetTextureSettings(sats); } } /// /// Creates VisualElements for the Inspector GUI of a TileSetImporter. /// /// /// Root VisualElement for the Inspector GUI of a TileSetImporter /// public override VisualElement CreateInspectorGUI() { m_MainElement = new TileSetImporterElement(serializedObject) { onRevert = Revert, onApply = ApplyAndImport }; m_MainElement.Bind(serializedTileSetObject, m_SpriteAtlas); return m_MainElement; } private void Revert() { m_SerializedTileSetObject = null; m_SerializedSpriteAtlasObject = null; LoadTileSet(); if (m_MainElement != null) m_MainElement.Bind(serializedTileSetObject, m_SpriteAtlas); } private void ApplyAndImport() { serializedObject.ApplyModifiedProperties(); serializedTileSetObject.ApplyModifiedPropertiesWithoutUndo(); foreach (var textureSource in m_TileSet.textureSources) { m_SpriteAtlas.Remove(new Object[] { textureSource.texture }); m_SpriteAtlas.Add(new Object[] { textureSource.texture }); } InternalEditorUtility.SaveToSerializedFileAndForget(new Object[] { m_TileSet, m_SpriteAtlas }, m_AssetPath, EditorSettings.serializationMode != SerializationMode.ForceBinary); AssetDatabase.ImportAsset(m_AssetPath); } } }