渋谷ほととぎす通信

完全趣味でやってるUnityメモ。説明できないところを説明できるようにするための個人ブログ。昨日の自分より少しでも大きくなれるように。。。 ※所属団体とは一切関係がありません

Unity スクリプトでMultipleのSpriteを取得する


f:id:esakun:20180713112034p:plain:w400

このようなテクスチャを用意し、

f:id:esakun:20180713112146p:plain:w400

Texture TtypeをSprite (2D and UI)に設定。SpriteModeをMultipleにします。


f:id:esakun:20180713111943p:plain:w400
Projectブラウザを見るとこのようにテクスチャにぶら下がる形でSpriteが並びます。
※Sprite Editorでスライス処理は割愛しています

このようにテクスチャに所属する形をとっているSpriteをエディタスクリプトで取得してみる備忘録です。

f:id:esakun:20180713231832p:plain:w400

Spriteを選択して以下のコードを実行すると、、、

Debug.Log(AssetDatabase.GetAssetPath(Selection.activeObject));

このようにAssets/SampleSprite.psd と、所属するアトラス(テクスチャ)のパスが出力されてしまいます。

Assets/SampleSprite/SampleSprite_3という風に階層構造で出力されることを想定していました。

そういうときは、AssetDatabase.LoadAllAssetsAtPathを使ってみます。

// 対象アトラスを取得
var atlas = Selection.activeObject;

 // 対象のパスを取得
var atlasPath = AssetDatabase.GetAssetPath(atlas);

// 対象のオブジェクトをすべて取得する
var objects = AssetDatabase.LoadAllAssetsAtPath(atlasPath);

// Sprite型にキャストして一致した配列を返す
var sprites = objects.OfType<Sprite>().ToArray();

これでアトラスオブジェクトからSpriteを取得できるようになりましたとさ。


public static IList<T> GetBelongObjects<T>(UnityEngine.Object obj) where T : UnityEngine.Object
{
    // 対象のパスを取得
    var path = AssetDatabase.GetAssetPath(obj);

    // 対象のオブジェクトをすべて取得する
    var objects = AssetDatabase.LoadAllAssetsAtPath(path);

    // T型キャストに一致した配列を返す
    return objects.OfType<T>().ToArray();
}

こういう汎用的なメソッドを用意しておくと便利なことがあるかもしれません。

以上。