using System;
using System.Collections.Generic;
using System.IO;
using UnityEditor.U2D;
using UnityEditorInternal;
using UnityEngine;
using UnityEngine.Tilemaps;
using UnityEngine.U2D;
using Object = UnityEngine.Object;
namespace UnityEditor.Tilemaps
{
///
/// Class containing utility functions for TileSet operations
///
internal static class TileSetUtility
{
static internal Action StartNewAssetNameEditingDelegate = ProjectWindowUtil.StartNameEditingIfProjectWindowExists;
private static bool HasTileSetExtension(string path)
{
return FileUtil.GetPathExtension(path).ToLower().Equals("tileset");
}
private static SpriteAtlas CreateDefaultSpriteAtlas()
{
var spriteAtlas = new SpriteAtlas();
spriteAtlas.SetV2();
var sats = new SpriteAtlasTextureSettings()
{
filterMode = FilterMode.Point,
anisoLevel = 0,
generateMipMaps = false,
sRGB = true,
};
spriteAtlas.SetTextureSettings(sats);
return spriteAtlas;
}
public static bool IsPalettePrefabFromTileSet(GameObject gameObject)
{
if (PrefabUtility.IsPartOfAnyPrefab(gameObject))
{
var prefab = PrefabUtility.GetPrefabAssetRootGameObject(gameObject);
var path = AssetDatabase.GetAssetPath(prefab);
return HasTileSetExtension(path);
}
return false;
}
internal static void CreateTileSetAssetInProjectWindow(string defaultAssetName)
{
var assetSelectionPath = AssetDatabase.GetAssetPath(Selection.activeObject);
var isFolder = false;
if (!string.IsNullOrEmpty(assetSelectionPath))
isFolder = File.GetAttributes(assetSelectionPath).HasFlag(FileAttributes.Directory);
var path = ProjectWindowUtil.GetActiveFolderPath();
if (isFolder)
{
path = assetSelectionPath;
}
var destName = AssetDatabase.GenerateUniqueAssetPath(Path.Combine(path, defaultAssetName));
var icon = EditorGUIUtility.IconContent().image as Texture2D;
CreateAssetEndNameEditAction action = ScriptableObject.CreateInstance();
StartNewAssetNameEditingDelegate(0, action, destName, icon, "");
}
internal static void CreateTileSetAsset(string pathName)
{
var tileSet = ScriptableObject.CreateInstance();
var spriteAtlas = CreateDefaultSpriteAtlas();
SaveTileSetAsset(pathName, tileSet, spriteAtlas);
}
internal class CreateAssetEndNameEditAction : ProjectWindowCallback.EndNameEditAction
{
public override void Action(int instanceId, string pathName, string resourceFile)
{
CreateTileSetAsset(pathName);
}
}
internal static TileSet LoadTileSetFromPalettePrefab(GameObject gameObject)
{
return LoadTileSetAsset(AssetDatabase.GetAssetPath(gameObject));
}
internal static TileSet LoadTileSetAsset(string pathName)
{
if (String.IsNullOrEmpty(pathName))
return null;
var objects = InternalEditorUtility.LoadSerializedFileAndForget(pathName);
TileSet tileSet = default;
foreach (var obj in objects)
{
if (obj is TileSet tileSetObj)
{
tileSet = tileSetObj;
break;
}
}
if (tileSet == null)
{
Debug.LogError("Unable to load TileSet asset");
return null;
}
return tileSet;
}
internal static SpriteAtlas LoadSpriteAtlasAsset(string pathName)
{
if (String.IsNullOrEmpty(pathName))
return null;
var objects = InternalEditorUtility.LoadSerializedFileAndForget(pathName);
SpriteAtlas spriteAtlas = default;
foreach (var obj in objects)
{
if (obj is SpriteAtlas spriteAtlasObj)
{
spriteAtlas = spriteAtlasObj;
break;
}
}
if (spriteAtlas == null)
{
Debug.LogError("Unable to load SpriteAtlas asset");
return null;
}
return spriteAtlas;
}
internal static void SaveTileSetAsset(string pathName, TileSet tileSet)
{
if (tileSet == null)
return;
if (!HasTileSetExtension(pathName))
return;
SpriteAtlas spriteAtlas = default;
if (String.IsNullOrEmpty(pathName))
{
spriteAtlas = CreateDefaultSpriteAtlas();
}
else
{
var objects = InternalEditorUtility.LoadSerializedFileAndForget(pathName);
foreach (var obj in objects)
{
if (obj is SpriteAtlas spriteAtlasObj)
{
spriteAtlas = spriteAtlasObj;
break;
}
}
}
if (spriteAtlas == null)
{
Debug.LogError("Unable to save TileSet asset", tileSet);
return;
}
SaveTileSetAsset(pathName, tileSet, spriteAtlas);
}
internal static void SaveTileSetAsset(string pathName, TileSet tileSet, SpriteAtlas spriteAtlas)
{
if (tileSet == null || spriteAtlas == null)
return;
if (!HasTileSetExtension(pathName))
return;
// Do this so that asset change save dialog will not show
var originalValue = EditorPrefs.GetBool("VerifySavingAssets", false);
EditorPrefs.SetBool("VerifySavingAssets", false);
InternalEditorUtility.SaveToSerializedFileAndForget(new Object[] {
tileSet, spriteAtlas
}, pathName, EditorSettings.serializationMode != SerializationMode.ForceBinary);
EditorPrefs.SetBool("VerifySavingAssets", originalValue);
AssetDatabase.ImportAsset(pathName, ImportAssetOptions.ForceSynchronousImport);
}
}
}