この記事でのバージョン
Unity 2017.1.0f3
はじめに
前回はSpriteAtlasの使い方等について紹介すると同時に、
GetSpriteで取得する際に文字列で指定する事や、全Spriteの取得が面倒
という問題点をあげました。
なので、今回はその問題点を改善する
SpriteAtlasに含まれるSpriteの名前を定数で自動生成するエディタ拡張と
全Spriteを楽に取得出来る拡張メソッドのご紹介です!
なお、記事中の画像は以下のアセットを使っております。
HD Icons Pack Vol.1 | 2D Icons | Unity Asset Store |
SpriteAtlasNameCreator
では早速、SpriteAtlasに含まれるSpriteの名前を定数で自動生成するエディタ拡張、
SpriteAtlasNameCreatorのプログラムです。
なお、SpriteAtlasNameCreatorを使うには、定数クラスを生成するクラス
ConstantsClassCreatorが必要になります。
下記記事のものとは微妙にプログラムが違うのでコチラを使ってください。
この二つをEditorディレクトリに入れ、
Resources/SpriteAtlasにSpriteAtlasを配置すると、
Scripts/SpriteAtlasKeyに自動で定数クラスが生成されるようになります。
また、Create/SpriteAtlasNameから手動で実行することも可能です。
なお、各ディレクトリのパスはSpriteAtlasNameCreatorの上部で設定しています。
例ではSpriteAtlasがResources内ですが、そうじゃなくても大丈夫です。
//SpriteAtlasが入っているディレクトリのパス private const string SPRITE_ATLAS_PATH = "Assets/Resources/SpriteAtlas"; //定数クラスを書き出すディレクトリのパス private const string CONSTNTS_CLASS_DIRECTORY_PATH = "Assets/Scripts/SpriteAtlasKey/";
生成された定数クラスは以下のようなもので、
/// <summary> /// ArmorAtlasに含まれるSpriteの名前を定数で管理するクラス /// </summary> public static class ArmorAtlasKey{ public const string ARMOR1 = "armor1"; public const string ARMOR2_01 = "armor2_01"; public const string ARMOR2_02 = "armor2_02"; public const string ARMOR2_03 = "armor2_03"; public const string ARMOR2_04 = "armor2_04"; public const string ARMOR3_01 = "armor3_01"; public const string ARMOR3_02 = "armor3_02"; public const string ARMOR3_03 = "armor3_03"; public const string ARMOR4_01 = "armor4_01"; public const string ARMOR4_02 = "armor4_02"; public const string ARMOR4_03 = "armor4_03"; public const string ARMOR5_01 = "armor5_01"; public const string ARMOR5_02 = "armor5_02"; public const string ARMOR5_03 = "armor5_03"; public const string ARMOR6_01 = "armor6_01"; public const string ARMOR6_02 = "armor6_02"; public const string ARMOR6_03 = "armor6_03"; public const string ARMOR6_04 = "armor6_04"; public const string ARMOR7_01 = "armor7_01"; public const string ARMOR7_02 = "armor7_02"; public const string ARMOR7_03 = "armor7_03"; public const string ARMOR7_04 = "armor7_04"; }
これを使えば、GetSpriteで取得する際に文字列で指定する必要がなくなります。
//文字列で指定せずにGetSpriteで取得が可能
Sprite amor1Sprite = armorAtlas.GetSprite(ArmorAtlasKey.ARMOR1);
また、定数クラスはSpriteAtlasが更新される度に自動で更新されるため、
Spriteの削除、追加、リネームにも簡単に対応できます。
SpriteAtlasExtension
続いて、全Spriteを楽に取得出来る拡張メソッド
SpriteAtlasExtensionのプログラムです。
SpriteAtlasExtensionを任意のディレクトリに生成すると、
たった1行で全Spriteを取得できるようになります!
//armorAtlasに含まれる全Spriteを取得
List<Sprite> allSpriteList = armorAtlas.GetAllSprite();
おわりに
本当はSpriteAtlasの生成、Spriteの追加まで自動でやりたかったのですが、調べてみた限り
プログラムからSpriteAtlasにSpriteやディレクトリを設定する事は出来ないっぽいです。
なので、「自動で画像を生成した後、さらに自動でパッキングする」
みたいな時はSprite Packerを使うしかなさそうです。