A game about forced loneliness, made by TACStudios
at master 185 lines 9.0 kB view raw
1using System; 2using UnityEditor.AssetImporters; 3using UnityEngine; 4using UnityEngine.U2D.Animation; 5using Object = UnityEngine.Object; 6 7namespace UnityEditor.U2D.Animation 8{ 9 [CanEditMultipleObjects] 10 [CustomEditor(typeof(SpriteLibrarySourceAssetImporter))] 11 internal class SpriteLibrarySourceAssetImporterInspector : ScriptedImporterEditor 12 { 13 static class Contents 14 { 15 public static readonly GUIContent openInSpriteLibraryEditor = new(L10n.Tr("Open in Sprite Library Editor")); 16 } 17 18 static class Style 19 { 20 public static readonly GUIContent mainAssetLabel = new("Main Library"); 21 } 22 23 SerializedProperty m_PrimaryLibraryGUID; 24 25 public override bool showImportedObject => false; 26 protected override Type extraDataType => typeof(SpriteLibrarySourceAsset); 27 28 public override void OnEnable() 29 { 30 base.OnEnable(); 31 m_PrimaryLibraryGUID = extraDataSerializedObject.FindProperty(SpriteLibrarySourceAssetPropertyString.primaryLibraryGUID); 32 } 33 34 protected override void InitializeExtraDataInstance(Object extraTarget, int targetIndex) 35 { 36 var assetPath = ((AssetImporter)targets[targetIndex]).assetPath; 37 var savedAsset = SpriteLibrarySourceAssetImporter.LoadSpriteLibrarySourceAsset(assetPath); 38 if (savedAsset != null) 39 { 40 // Add entries from Main Library Asset. 41 if (!SpriteLibrarySourceAssetImporter.HasValidMainLibrary(savedAsset, assetPath)) 42 savedAsset.SetPrimaryLibraryGUID(string.Empty); 43 SpriteLibrarySourceAssetImporter.UpdateSpriteLibrarySourceAssetLibraryWithMainAsset(savedAsset); 44 45 (extraTarget as SpriteLibrarySourceAsset).InitializeWithAsset(savedAsset); 46 } 47 } 48 49 public override void OnInspectorGUI() 50 { 51 if (GUILayout.Button(Contents.openInSpriteLibraryEditor)) 52 { 53 var path = ((AssetImporter)target).assetPath; 54 var asset = AssetDatabase.LoadAssetAtPath<SpriteLibraryAsset>(path); 55 SpriteLibraryEditor.SpriteLibraryEditorWindow.OpenWindowForAsset(asset); 56 } 57 58 GUILayout.Space(10); 59 60 serializedObject.Update(); 61 extraDataSerializedObject.Update(); 62 DoMainAssetGUI(); 63 serializedObject.ApplyModifiedProperties(); 64 extraDataSerializedObject.ApplyModifiedProperties(); 65 66 ApplyRevertGUI(); 67 } 68 69 protected override void Apply() 70 { 71 // Make sure that all changes are Saved / Reverted by the user if there is an instance of SpriteLibraryEditorWindow open. 72 SpriteLibraryEditor.SpriteLibraryEditorWindow.HandleUnsavedChangesOnApply(); 73 base.Apply(); 74 75 for (var i = 0; i < targets.Length; i++) 76 { 77 var path = ((AssetImporter)targets[i]).assetPath; 78 var sourceAsset = (SpriteLibrarySourceAsset)extraDataTargets[i]; 79 var savedAsset = SpriteLibrarySourceAssetImporter.LoadSpriteLibrarySourceAsset(path); 80 savedAsset.InitializeWithAsset(sourceAsset); 81 82 // Remove entries that come from Main Library Asset before saving. 83 var savedLibrarySerializedObject = new SerializedObject(savedAsset); 84 SpriteLibraryUtilitiesEditor.UpdateLibraryWithNewMainLibrary(null, savedLibrarySerializedObject.FindProperty(SpriteLibrarySourceAssetPropertyString.library)); 85 if (savedLibrarySerializedObject.hasModifiedProperties) 86 savedLibrarySerializedObject.ApplyModifiedPropertiesWithoutUndo(); 87 88 // Save asset to disk. 89 SpriteLibrarySourceAssetImporter.SaveSpriteLibrarySourceAsset(savedAsset, path); 90 } 91 92 // Due to case 1418417 we can't guarantee 93 // that changes will be propagated to the SpriteLibraryEditor window. 94 // Until fixed, keep this line to ensure that SpriteLibraryEditor window reloads. 95 SpriteLibraryEditor.SpriteLibraryEditorWindow.TriggerAssetModifiedOnApply(); 96 } 97 98 void DoMainAssetGUI() 99 { 100 EditorGUI.BeginChangeCheck(); 101 if (m_PrimaryLibraryGUID.hasMultipleDifferentValues) 102 EditorGUI.showMixedValue = true; 103 var currentMainSpriteLibraryAsset = AssetDatabase.LoadAssetAtPath<SpriteLibraryAsset>(AssetDatabase.GUIDToAssetPath(m_PrimaryLibraryGUID.stringValue)); 104 var newMainLibraryAsset = EditorGUILayout.ObjectField(Style.mainAssetLabel, currentMainSpriteLibraryAsset, typeof(SpriteLibraryAsset), false) as SpriteLibraryAsset; 105 if (EditorGUI.EndChangeCheck()) 106 { 107 var successfulAssignment = true; 108 for (var i = 0; i < targets.Length; ++i) 109 successfulAssignment = AssignNewMainLibrary(targets[i], extraDataTargets[i] as SpriteLibrarySourceAsset, newMainLibraryAsset); 110 111 if (successfulAssignment) 112 m_PrimaryLibraryGUID.stringValue = AssetDatabase.AssetPathToGUID(AssetDatabase.GetAssetPath(newMainLibraryAsset)); 113 } 114 115 EditorGUI.showMixedValue = false; 116 } 117 118 static bool AssignNewMainLibrary(Object target, SpriteLibrarySourceAsset extraTarget, SpriteLibraryAsset newMainLibrary) 119 { 120 var assetPath = ((AssetImporter)target).assetPath; 121 var spriteLibraryAsset = AssetDatabase.LoadAssetAtPath<SpriteLibraryAsset>(assetPath); 122 var parentChain = SpriteLibrarySourceAssetImporter.GetAssetParentChain(newMainLibrary); 123 if (assetPath == AssetDatabase.GetAssetPath(newMainLibrary) || parentChain.Contains(spriteLibraryAsset)) 124 { 125 Debug.LogWarning(TextContent.spriteLibraryCircularDependency); 126 return false; 127 } 128 129 var path = ((AssetImporter)target).assetPath; 130 var toSavedAsset = SpriteLibrarySourceAssetImporter.LoadSpriteLibrarySourceAsset(path); 131 132 toSavedAsset.InitializeWithAsset(extraTarget); 133 var savedLibrarySerializedObject = new SerializedObject(toSavedAsset); 134 SpriteLibraryUtilitiesEditor.UpdateLibraryWithNewMainLibrary(newMainLibrary, savedLibrarySerializedObject.FindProperty(SpriteLibrarySourceAssetPropertyString.library)); 135 if (savedLibrarySerializedObject.hasModifiedProperties) 136 savedLibrarySerializedObject.ApplyModifiedPropertiesWithoutUndo(); 137 138 return true; 139 } 140 } 141 142 internal class CreateSpriteLibrarySourceAsset : ProjectWindowCallback.EndNameEditAction 143 { 144 const int k_SpriteLibraryAssetMenuPriority = 30; 145 string m_MainLibrary; 146 147 public override void Action(int instanceId, string pathName, string resourceFile) 148 { 149 var asset = CreateInstance<SpriteLibrarySourceAsset>(); 150 asset.SetPrimaryLibraryGUID(m_MainLibrary); 151 152 UnityEditorInternal.InternalEditorUtility.SaveToSerializedFileAndForget(new Object[] { asset }, pathName, true); 153 AssetDatabase.Refresh(ImportAssetOptions.ForceUpdate); 154 155 m_MainLibrary = string.Empty; 156 157 ProjectWindowUtil.ShowCreatedAsset(AssetDatabase.LoadAssetAtPath<Object>(pathName)); 158 } 159 160 [MenuItem("Assets/Create/2D/Sprite Library Asset", priority = k_SpriteLibraryAssetMenuPriority)] 161 static void CreateSpriteLibrarySourceAssetMenu() 162 { 163 var action = CreateInstance<CreateSpriteLibrarySourceAsset>(); 164 var icon = EditorIconUtility.LoadIconResource("Sprite Library", "Icons/Light", "Icons/Dark"); 165 ProjectWindowUtil.StartNameEditingIfProjectWindowExists(0, action, SpriteLibrarySourceAsset.defaultName + SpriteLibrarySourceAsset.extension, icon, null); 166 } 167 168 [MenuItem("Assets/Create/2D/Sprite Library Asset Variant", priority = k_SpriteLibraryAssetMenuPriority + 1)] 169 static void CreateSpriteLibrarySourceAssetVariantMenu() 170 { 171 var action = CreateInstance<CreateSpriteLibrarySourceAsset>(); 172 var asset = SpriteLibrarySourceAssetImporter.GetAssetFromSelection(); 173 if (asset != null) 174 action.m_MainLibrary = AssetDatabase.GUIDFromAssetPath(AssetDatabase.GetAssetPath(asset)).ToString(); 175 var icon = EditorIconUtility.LoadIconResource("Sprite Library", "Icons/Light", "Icons/Dark"); 176 ProjectWindowUtil.StartNameEditingIfProjectWindowExists(0, action, SpriteLibrarySourceAsset.defaultName + SpriteLibrarySourceAsset.extension, icon, null); 177 } 178 179 [MenuItem("Assets/Create/2D/Sprite Library Asset Variant", true, priority = k_SpriteLibraryAssetMenuPriority + 1)] 180 static bool ValidateCanCreateVariant() 181 { 182 return SpriteLibrarySourceAssetImporter.GetAssetFromSelection() != null; 183 } 184 } 185}