LoginSignup
2
1

More than 5 years have passed since last update.

AssetBundleManagerを使ったときのMultipleなsprite読み込み

Last updated at Posted at 2017-05-22

AssetBundleManager
https://www.assetstore.unity3d.com/jp/#!/content/45836
が便利そうなので使いたい。
TexturePackerとかでPackしたMultipleなSpriteを読み込みたい。

でも、アセット読み込むのって

AssetBundleManager.LoadAssetAsync(string assetbubdleName, string assetName,System.Type type)

しかないですよね?
で、たぶん、読み込んだTexture2DをSpriteにするには、以下のようにするしかなさそう。

LoadAssets.cs
//公式の同名サンプルの、最後のメソッドををいじったものです。
//わかりやすいようにメソッド名は同じにしておきます。
 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.で、読み込みを以下のように変える。

LoadAssets.cs
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);
}

ほんとは一個ずつじゃなくて、いっぺんに切り出すとして、
こんな冗長なやり方じゃなく、
スパッと一気に取得する方法があるような気がするのですが、
誰か教えてください。
ここ読め、とかでもいいので、、、。

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1