概要
普段はTexturePackerを使っているのでSpritePackerについてはよく知らなかったのですが、
「SpritePackerでまとめたテクスチャって別ファイルとして生成されないけどAssetBundle化したい場合どうするの?」
という趣旨の疑問を投げ掛けられたので、いろいろ検証してみました。
今回はその結果から得られた結論とざっくりとした手順を綴ります。
※検証環境は Unity 5.3.1 です。
結論
パックしたテクスチャを同じアセットバンドルに突っ込めばOK!
とっても簡単ね!
手順
1. Textureの設定
まとめたいテクスチャの設定は、
- ファイルは
Resources
外に SpriteMode
をSingle
に-
PackingTag
を同じ値に - 圧縮設定も統一
する必要があるよ。
TexAとTexBを一つのアトラスにまとめたい場合は、
こんな感じ。
2. Packする
メニューから Window -> SpritePacker を選んでね。
SpritePackerウィンドウが開いたら、左上の[Pack]ボタンを押してね!
うまくいけば手順1で設定した通りのアトラスができあがるよ!
※上図はアトラス化が成功した後の図です。
3. AssetBundle化設定
次に、アトラスに含めた2つのテクスチャを同じAssetBundleに入れる設定をするよ。
Projectツリーで2つのテクスチャを選択し、Inspectorで任意のAssetBundle名をつけてね!
設定が終わったら、AssetBundleをビルドしてね!
※AssetBundleの作り方とかその辺は割愛します。
4. 読み込んで、取り出して、表示してみる
こんな感じのコードを書いたよ。
using System;
using UnityEngine;
using System.Collections; class BundleTest : MonoBehaviour
{
public SpriteRenderer spriteA = null; //!< 予めシーンに配置してあるSprite
public SpriteRenderer spriteB = null; //!< 予めシーンに配置してあるSprite
IEnumerator Start()
{
// AssetBundleを取得(AssetBundleを置いたURLを指定してね!)
using( WWW www = new WWW( "file://C:/unity/AssetBundles/mytexbundle" ) )
{
yield return www;
if( www.error != null )
throw new Exception( "エラーだよ : " + www.error );
AssetBundle bundle = www.assetBundle;
// シーンのSpriteにAssetBundle内のリソースを割り当てる
{
if( spriteA != null )
// mytexbundleからTexAを取り出してSpriteAに割り当て
spriteA.sprite = bundle.LoadAsset( "TexA" ) as Sprite;
if( spriteB != null )
// mytexbundleからTexBを取り出してSpriteBに割り当て
spriteB.sprite = bundle.LoadAsset( "TexB" ) as Sprite;
}
bundle.Unload( false );
}
}
}
2つのスプライト(元は2つのテクスチャ)の描画が1回になっていれば、SpritePackerとAssetBundleの併用実験は成功だよ!