(:3[kanのメモ帳]

個人ゲーム開発者kan.kikuchiのメモ的技術ブログ。月木更新でUnity関連がメイン。

SpriteAtlasを使い易くする拡張【Unity】【エディタ拡張】【拡張メソッド】


このエントリーをはてなブックマークに追加


この記事でのバージョン
Unity 2017.1.0f3


はじめに

前回はSpriteAtlasの使い方等について紹介すると同時に、

GetSpriteで取得する際に文字列で指定する事や、全Spriteの取得が面倒

という問題点をあげました。



なので、今回はその問題点を改善する

SpriteAtlasに含まれるSpriteの名前を定数で自動生成するエディタ拡張と

全Spriteを楽に取得出来る拡張メソッドのご紹介です!


なお、記事中の画像は以下のアセットを使っております。





SpriteAtlasNameCreator

では早速、SpriteAtlasに含まれるSpriteの名前を定数で自動生成するエディタ拡張、

SpriteAtlasNameCreatorのプログラムです。



なお、SpriteAtlasNameCreatorを使うには、定数クラスを生成するクラス

ConstantsClassCreatorが必要になります。

下記記事のものとは微妙にプログラムが違うのでコチラを使ってください。



この二つをEditorディレクトリに入れ、


f:id:kan_kikuchi:20170725073547j:plain


Resources/SpriteAtlasにSpriteAtlasを配置すると、


f:id:kan_kikuchi:20170725074229j:plain


Scripts/SpriteAtlasKeyに自動で定数クラスが生成されるようになります。


f:id:kan_kikuchi:20170725082553g:plain


また、Create/SpriteAtlasNameから手動で実行することも可能です。


f:id:kan_kikuchi:20170725082341g:plain


なお、各ディレクトリのパスは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";

}

f:id:kan_kikuchi:20170725074502j:plain


これを使えば、GetSpriteで取得する際に文字列で指定する必要がなくなります。

//文字列で指定せずにGetSpriteで取得が可能
Sprite amor1Sprite = armorAtlas.GetSprite(ArmorAtlasKey.ARMOR1);


また、定数クラスはSpriteAtlasが更新される度に自動で更新されるため、

Spriteの削除、追加、リネームにも簡単に対応できます。


SpriteAtlasExtension

続いて、全Spriteを楽に取得出来る拡張メソッド

SpriteAtlasExtensionのプログラムです。



SpriteAtlasExtensionを任意のディレクトリに生成すると、


f:id:kan_kikuchi:20170725080321j:plain


たった1行で全Spriteを取得できるようになります!

//armorAtlasに含まれる全Spriteを取得
List<Sprite> allSpriteList = armorAtlas.GetAllSprite();



おわりに

本当はSpriteAtlasの生成、Spriteの追加まで自動でやりたかったのですが、調べてみた限り

プログラムからSpriteAtlasにSpriteやディレクトリを設定する事は出来ないっぽいです。


なので、「自動で画像を生成した後、さらに自動でパッキングする」

みたいな時はSprite Packerを使うしかなさそうです。