private static void SaveGeneratedSprites(List <Sprite> sprites, bool decoupleSpriteData, SerializedProperty generatedSpritesFolderGuidProperty, SerializedProperty spritesProperty, UnityEngine.Object target) { if (!decoupleSpriteData) { // Delete generated sprites folder (in case it was previously created). if (!string.IsNullOrWhiteSpace(generatedSpritesFolderGuidProperty.stringValue)) { var folderPath = AssetDatabase.GUIDToAssetPath(generatedSpritesFolderGuidProperty.stringValue); if (AssetDatabase.IsValidFolder(folderPath)) { AssetDatabase.DeleteAsset(folderPath); } } // Update rebuilded sprites to preserve references and delete stale ones. var spritesToAdd = new List <Sprite>(sprites); for (int i = spritesProperty.arraySize - 1; i >= 0; i--) { var oldSprite = spritesProperty.GetArrayElementAtIndex(i).objectReferenceValue as Sprite; if (!oldSprite) { continue; } var newSprite = spritesToAdd.Find(sprite => sprite.name == oldSprite.name); if (newSprite) { EditorUtility.CopySerialized(newSprite, oldSprite); spritesToAdd.Remove(newSprite); } else { DestroyImmediate(oldSprite, true); } } foreach (var spriteToAdd in spritesToAdd) { AssetDatabase.AddObjectToAsset(spriteToAdd, target); } AssetDatabase.Refresh(); AssetDatabase.SaveAssets(); spritesProperty.SetListValues(spritesToAdd, false); } else { // Delete sprites stored in atlas asset (in case they were previously added). for (int i = spritesProperty.arraySize - 1; i >= 0; i--) { DestroyImmediate(spritesProperty.GetArrayElementAtIndex(i).objectReferenceValue, true); } AssetDatabase.Refresh(); AssetDatabase.SaveAssets(); var folderPath = AssetDatabase.GetAssetPath(target).GetBeforeLast("/") + "/" + target.name; var dicedSpritesFolder = new FolderAssetHelper(folderPath); var savedDicedSprites = dicedSpritesFolder.SetContainedAssets(sprites); generatedSpritesFolderGuidProperty.stringValue = AssetDatabase.AssetPathToGUID(folderPath); spritesProperty.SetListValues(savedDicedSprites); } }
private void CreateDicedSprites(Dictionary <string, List <DicedUnit> > dicedUnits) { DisplayProgressBar("Generating diced sprites data...", 1f); // Generate diced sprites using diced units. var newDicedSprites = dicedUnits.Select(nameToUnits => DicedSprite.CreateInstance(nameToUnits.Key, nameToUnits.Value.First().AtlasTexture, nameToUnits.Value, defaultPivotProperty.vector2Value, keepOriginalPivotProperty.boolValue)).ToList(); // Save generated sprites. if (!decoupleSpriteDataProperty.boolValue) { // Delete generated sprites folder (in case it was previously created). if (!string.IsNullOrWhiteSpace(generatedSpritesFolderGuidProperty.stringValue)) { var folderPath = AssetDatabase.GUIDToAssetPath(generatedSpritesFolderGuidProperty.stringValue); if (AssetDatabase.IsValidFolder(folderPath)) { AssetDatabase.DeleteAsset(folderPath); } } // Update rebuilded sprites to preserve references and delete stale ones. var spritesToAdd = new List <DicedSprite>(newDicedSprites); for (int i = dicedSpritesProperty.arraySize - 1; i >= 0; i--) { var oldSprite = dicedSpritesProperty.GetArrayElementAtIndex(i).objectReferenceValue as DicedSprite; if (!oldSprite) { continue; } var newSprite = spritesToAdd.Find(sprite => sprite.Name == oldSprite.Name); if (newSprite) { EditorUtility.CopySerialized(newSprite, oldSprite); spritesToAdd.Remove(newSprite); } else { DestroyImmediate(oldSprite, true); } } foreach (var spriteToAdd in spritesToAdd) { AssetDatabase.AddObjectToAsset(spriteToAdd, target); } AssetDatabase.Refresh(); AssetDatabase.SaveAssets(); dicedSpritesProperty.SetListValues(spritesToAdd, false); } else { // Delete sprites stored in atlas asset (in case they were previously added). for (int i = dicedSpritesProperty.arraySize - 1; i >= 0; i--) { DestroyImmediate(dicedSpritesProperty.GetArrayElementAtIndex(i).objectReferenceValue, true); } AssetDatabase.Refresh(); AssetDatabase.SaveAssets(); var folderPath = AssetDatabase.GetAssetPath(target).GetBeforeLast("/") + "/" + target.name; var dicedSpritesFolder = new FolderAssetHelper(folderPath); var savedDicedSprites = dicedSpritesFolder.SetContainedAssets(newDicedSprites); generatedSpritesFolderGuidProperty.stringValue = AssetDatabase.AssetPathToGUID(folderPath); dicedSpritesProperty.SetListValues(savedDicedSprites); } }