テラシュールブログスマートフォン用の表示で見るテラシュールブログ旧テラシュールウェアブログUnity記事。UnityのTipsやAR・VR、ニコニコ動画についてのメモを残します。Spriteから特定のスプライトを取得する方法と、その挙動についてです。Sprite、つまりスプライトを分割した内容ならばそうはいきません。AssetBundle.LoadAllAssetsでは駄目ここでResources.LoadAllと似たようにAssetBundle.LoadAllAssetsと行きたい処ですが、この方法ではAssetBundleに格納されている全てのアセットをロードする事になり、余計なメモリと解放分のCPUが必要となります。下の画像は、Sprite一つを呼ぶはずがAssetBundleに格納されている全てのテクスチャ(RobotBoy関連)が読まれてしまっている状態です。AssetBundle.LoadAssetWithSubAssetsなのでAssetBundle.LoadAssetWithSubAssetsを使用します。こちらであれば、AssetBundleから指定のテクスチャから生成したスプライトしか呼ぶことは無いので、上のように無駄なテクスチャが読まれる事はありません。docs.unity3d.com不要なスプライトの破棄しかし、まだSpriteが無駄にいっぱい生成されています。これは、ロードしたMultipleSpriteが「複数のスプライトを含む1つのアセット」である事に由来してると思います。これ一つ一つは大した問題では無いのですが、使わないのであれば気持ち悪いので使うものだけ残します。Resource.Unloadで使っていなければ一つ一つ潰しても良いのですが、Resources.UnloadUnusedAssetsで一気に潰してしまいます。これで、ひとまずはSpriteを単体ロードする事が出来ます。下のコードは、StreamingAssetsに格納したplayerアセットバンドルの、RobotBoyJumpSpriteテクスチャが持っているRobotBoyJump00スプライトを取得する例です。gist.github.com特定のスプライト参照からスプライトを取得するこれとは別に、Spriteを単体で取得する方法もあるにはあります。要するに特定のSpriteへの参照を元にスプライトを取得するアプローチです。これ以外でも、とにかく「他のComponentやScriptableObject、Animation等から参照されている」場合、該当のスプライトのみを抽出することが出来ます。この方法で取得した場合、AssetBundle.LoadAssetWithSubAssetsと比較してスプライトが生成しませんしロード後の検索も不要です。実装にひと手間付きます。AssetBundleに格納するSpriteScriptableObjectをロードしスプライトを抽出する(LoadAB)これでスプライトをロードした場合、スプライトちゃんと単品で呼ばれます。Resources.Unloadで消してやれば一緒に呼ばれるScriptableObjectもちゃんと破棄されます。ちなみに、こうして指定スプライトを抜きだした場合でもテクスチャは1枚分まるっと読まれます。しないと、「テクスチャをロード後、スプライトが表示する範囲のテクスチャを生成し、それを元にSpriteを生成し...」みたいな事になります。DynamicFontが似たような事やってますが、Spriteではやってないのでやはり負荷が...圧縮したTexture使えなくなりますし。Spriteと挙動Resourcesと異なり、AssetBundleはSpritePackerでパックしたスプライトもロードすることが可能です。その際、AssetBundle.LoadAssetWithSubAssetsから呼び出した時のスプライトおよびテクスチャは、「テクスチャはパック済みの内容」「スプライトはテクスチャ単位」で取得されます。いった状況かと言えば、こんな感じです。SpriteをSpritePackerでパックします。元々は2048x2048のスプライト1枚なのですが、パックする事で無駄な領域が消え1024x512となります。名前はSpriteAtlasTexture-Packer云々。これをロードすると、スプライトの元となるテクスチャはAssetBundle1枚ですが、呼び出し生成するSpriteはMultipleSpriteに依存するので、スプライトが一杯作られた...そんな感じだと思います。Spriteからスプライトを生成するよりScriptableObject等から特定のスプライトを参照するなり、単体のスプライトをSpritePackerでまとめた方が良いかもしれません...が、PrefabやAnimationからSpriteを参照する場合は普通に読めるので、これは「Spriteをランタイムに取得して差し込む」ようなケース以外ではそれほど重要ではないかもしれません。スプライトをAssetBundleから取得してみます。(1)月別アーカイブはてなブログをはじめよう!tsubaki_t1さんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。