(:3[kanのメモ帳]

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

SliceしたSpriteの取得を簡単にし、キャッシュもする便利クラス【Unity】


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

この記事でのバージョン
Unity 5.6.1f1


はじめに

UnityではSpriteEditorを使って一つの画像から複数のSpriteへSliceする事が可能です。


f:id:kan_kikuchi:20170612052729p:plain


こうすることで、一枚一枚で使うよりSetPass Calls(描画命令回数?)が減り、処理が軽くなりますが、

Sliceした画像を読み込むには以下のようにちょっと手間がかかります。

//スライスした画像を全て読み込み
Sprite[] sprites  = Resources.LoadAll<Sprite>("Atlas/SpriteAtlas");

//読み込んだ画像から任意(Cloud)の画像を検索し、取得
Sprite  cloudSprite = System.Array.Find<Sprite>(sprites, (sprite) => sprite.name.Equals("Cloud"));


一度だけならいいですが、何度も同じ処理を書く事は避けたいですし、

Resources.LoadAllとSystem.Array.Findを何度も実行するのは負荷的にも心配です。


という事で、

SliceしたSpriteの取得を簡単にし、キャッシュもする便利クラスSlicedSpriteUtilityを作りました。


SlicedSpriteUtility

さっそくSlicedSpriteUtilityのプログラムです。



上記のSlicedSpriteUtility.csを作成したら、特に設定等を行わずにそのまま使用可能です。


Sliceした全Sprteを取得したい場合はGetSpriteDict

1つのSpriteを取得した場合はLoadSpriteを使います。

//Resources/GUIのSprite3を取得する
Sprite sprite3 = SlicedSpriteUtility.LoadSprite("GUI", "Sprite3");

f:id:kan_kikuchi:20170612055530j:plain

//Resources/GUIのSliceした全スプライトをロード
Dictionary<string, Sprite> spriteDict = SlicedSpriteUtility.LoadSpriteDict("GUI");

f:id:kan_kikuchi:20170612055539j:plain


なお、画像が存在しない場合やSliceしたSpriteが存在しない場合は警告が表示され、nullが返されます。


f:id:kan_kikuchi:20170612055745p:plain


また、取得した画像はキャッシュされるため、

二度目以降はResources.LoadAllとSystem.Array.Findもされません。

//ロードすると同時にキャッシュ
Sprite sprite3 = SlicedSpriteUtility.LoadSprite("GUI", "Sprite3");

//GUIの全Spriteはキャッシュされているので、Resources.LoadAllとSystem.Array.Findは実行されない
Sprite sprite4 = SlicedSpriteUtility.LoadSprite("GUI", "Sprite4");


ただ、シーンの移動等をしてもキャッシュは永久に保持されるのため、

場合によっては適宜ClearCacheでキャッシュを破棄した方が良いかもしれません。

//キャッシュを破棄
SlicedSpriteUtility.ClearCache();


ClearCache時にも破棄せず、永続的に保持したい場合

PERMAMENT_SPRITE_PATH_LISTにパスを指定します。

//永久にキャッシュする画像のパス
private readonly static List<string> PERMAMENT_SPRITE_PATH_LIST = new List<string>(){
  "GUI", "GUI2", "GUI3"
};


余談ですが、以前紹介したSceneNavigatorを使えば、

シーン移動前にキャッシュを破棄するなんて事も可能です。



さらに余談ですが、画像のパスは自動生成&更新すると何かと楽だと思います。