AssetBundleManager
https://www.assetstore.unity3d.com/jp/#!/content/45836
が便利そうなので使いたい。
TexturePackerとかでPackしたMultipleなSpriteを読み込みたい。
でも、アセット読み込むのって
AssetBundleManager.LoadAssetAsync(string assetbubdleName, string assetName,System.Type type)
しかないですよね?
で、たぶん、読み込んだTexture2DをSpriteにするには、以下のようにするしかなさそう。
//公式の同名サンプルの、最後のメソッドををいじったものです。
//わかりやすいようにメソッド名は同じにしておきます。
protected IEnumerator InstantiateGameObjectAsync(string assetBundleName, string assetName)
{
AssetBundleLoadAssetOperation request =
AssetBundleManager.LoadAssetAsync(assetBundleName, assetName, typeof(Texture2D));
if (request == null)
yield break;
yield return StartCoroutine(request);
//画像を取得
Texture2D texture = request.GetAsset<Texture2D>();
Sprite img = Sprite.Create (texture, new Rect (0f, 0f, texture.width, texture.height), Vector2.zero);
}
でもこれだとmultipleな画像取り出しができない。
なので、以下のようにしてみる。
とりあえず、画像名:character-0.pngだとする。
1.TexturePackerが書き出すcharacter-0.tpsheetというファイルを
--1.拡張子を.txtにする
--2.名前を被らないようにファイル名-data.txtみたいに変えとく
で、character-0-data.txtという名前にして、AssetBundleに含める。
ちなみにTexturePackerが吐き出すのは、以下のようなテキスト。
#
# Sprite sheet data for Unity.
#
# To import these sprites into your Unity project, download "TexturePackerImporter":
# http://www.codeandweb.com/texturepacker/unity
#
# $TexturePacker:SmartUpdate:(ハッシュ値みたいなの)
#
:format=40300
:texture=charaters-0.png
:size=512x512
:pivotpoints=enabled
:borders=disabled
(画像ファイル名0);273;391;120;120; 0.5;0.5; 0;0;0;0
(画像ファイル名1);273;269;120;120; 0.5;0.5; 0;0;0;0
(画像ファイル名2);137;253;120;120; 0.5;0.5; 0;0;0;0
(画像ファイル名3);137;131;120;120; 0.5;0.5; 0;0;0;0
(画像ファイル名4);1;375;134;136; 0.5;0.5; 0;0;0;0
(画像ファイル名5);1;237;134;136; 0.5;0.5; 0;0;0;0
(画像ファイル名6);1;99;134;136; 0.5;0.5; 0;0;0;0
(画像ファイル名7);137;375;134;136; 0.5;0.5; 0;0;0;0
(画像ファイル名n)の後に入るのは、切り出しのときのx,y,w,h。
2.で、読み込みを以下のように変える。
protected IEnumerator InstantiateGameObjectAsync(string assetBundleName, string assetName)
{
AssetBundleLoadAssetOperation request =
AssetBundleManager.LoadAssetAsync(assetBundleName, assetName, typeof(Texture2D));
if (request == null)
yield break;
yield return StartCoroutine(request);
//画像を取得
Texture2D texture = request.GetAsset<Texture2D>();
//テキストを取得
AssetBundleLoadAssetOperation data =
AssetBundleManager.LoadAssetAsync(
assetBundleName,
"character-0-data", //ほんとは外から設定
typeof(TextAsset)
);
if (data == null)
yield break;
yield return StartCoroutine(data);
float[] n = new float[4];
TextAsset txt = data.GetAsset<TextAsset> ();
string[] lines = txt.text.Split ('\n');
for (int i = 0; i < lines.Length; i++) {
if (lines [i].Contains ("ここに切り出したい画像名")) {
string[] tmp = lines [i].Split (';');
n [0] = float.Parse(tmp [1]);
n [1] = float.Parse(tmp [2]);
n [2] = float.Parse(tmp [3]);
n [3] = float.Parse(tmp [4]);
break;
}
}
//これで切り出された画像が手に入る。
Sprite trimImage
= Sprite.Create (texture, new Rect (n[0], n[1], n[2],n[3]), Vector2.zero);
}
ほんとは一個ずつじゃなくて、いっぺんに切り出すとして、
こんな冗長なやり方じゃなく、
スパッと一気に取得する方法があるような気がするのですが、
誰か教えてください。
ここ読め、とかでもいいので、、、。