この記事でのバージョン
Unity 5.6.1f1
はじめに
UnityではSpriteEditorを使って一つの画像から複数のSpriteへSliceする事が可能です。
Mobile Scifi GUI | 2D GUI | Unity Asset Store |
こうすることで、一枚一枚で使うより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");
//Resources/GUIのSliceした全スプライトをロード Dictionary<string, Sprite> spriteDict = SlicedSpriteUtility.LoadSpriteDict("GUI");
なお、画像が存在しない場合やSliceしたSpriteが存在しない場合は警告が表示され、nullが返されます。
また、取得した画像はキャッシュされるため、
二度目以降は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を使えば、
シーン移動前にキャッシュを破棄するなんて事も可能です。
さらに余談ですが、画像のパスは自動生成&更新すると何かと楽だと思います。