Skip to content

Instantly share code, notes, and snippets.

@irfanbaysal
Last active September 4, 2023 07:16
Show Gist options
  • Save irfanbaysal/3e8d8c209b8994d17636e7511315f0b5 to your computer and use it in GitHub Desktop.
Save irfanbaysal/3e8d8c209b8994d17636e7511315f0b5 to your computer and use it in GitHub Desktop.
Preset Editor
using System.Collections.Generic;
using System.IO;
using System.Linq;
using Sirenix.OdinInspector;
using UnityEditor;
using UnityEditor.Presets;
using UnityEngine;
using UnityEngine.Serialization;
namespace PresetEditor
{
[CreateAssetMenu(fileName = "PresetEditor", menuName = "ScriptableObjects/PresetEditor")]
public class PresetEditor : ScriptableObject
{
#if UNITY_EDITOR
[Header("General Settings")]
[SerializeField] private string searchPath = "Assets/Your/Specific/Path";
[Header("Sprite Settings")]
[SerializeField] private List<Sprite> sprites = new();
[SerializeField] private string requiredSpriteFolderName = "FolderName";
[SerializeField] private Preset spritePreset;
[Button(ButtonSizes.Large)]
public void GetAllSprites()
{
sprites.Clear();
var spriteFolders = FindFolder(searchPath,requiredSpriteFolderName);
sprites = FindSpritesInFolders(spriteFolders);
}
[Button(ButtonSizes.Large)]
public void PerformPresetToAllSprites()
{
foreach (var t in sprites)
{
ApplyPresetToSprite(t);
}
}
private void ApplyPresetToSprite(Sprite sprite)
{
var assetPath = AssetDatabase.GetAssetPath(sprite);
TextureImporter textureImporter = AssetImporter.GetAtPath(assetPath) as TextureImporter;
if (textureImporter != null)
{
if (spritePreset.DataEquals(textureImporter))
{
Debug.Log($"{textureImporter} is the same preset as you want to apply");
return;
}
spritePreset.ApplyTo(textureImporter);
AssetDatabase.ImportAsset(assetPath);
}
else
{
Debug.LogWarning("Failed to apply preset to sprite: " + sprite.name);
}
}
private List<string> FindFolder(string path,string requiredFolderNameString)
{
var allFolders = Directory.GetDirectories(path, "*", SearchOption.AllDirectories);
return (from folderPath in allFolders let folderName = Path.GetFileName(folderPath) where folderName.Equals(requiredFolderNameString) select folderPath).ToList();
}
private List<Sprite> FindSpritesInFolders(List<string> folders)
{
return folders
.SelectMany(folderPath => Directory.GetFiles(folderPath, "*.png", SearchOption.AllDirectories),
(folderPath, texturePath) => AssetDatabase.LoadAssetAtPath<Sprite>(texturePath))
.Where(texture => texture != null)
.ToList();
}
#endif
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment