さけのさかなのブログ

同人ゲーム開発やってます。Unity使ったりする。

【Unity】MultiModeなSpriteの参照を取得し直す

問題

 MultiModeなSpriteの参照をGameObjectだかScriptableObjectが持っているとき。
 画像の変更か何かがあってSliceし直すと、Spriteへの参照がMissingになる。これをなんとかする。

理屈

 Spriteが生成し直されるのはどうしようもない(多分)ので、Textureと位置からSpriteを再取得する。

雑コード

 だいたいこんなん。

Unity5.3.2p3

public class Hoge : MonoBehaviour
{
#if UNITY_EDITOR
    [SerializeField]
    Texture texture;

    [SerializeField]
    Rect spriteRect;
#endif

    [SerializeField]
    Sprite sprite;

#if UNITY_EDITOR
    void OnValidate()
    {
        if (!texture)
        {
            return;
        }
        if (sprite)
        {
            return;
        }

        var path = AssetDatabase.GetAssetPath(texture);
        var sprites = AssetDatabase.LoadAllAssetRepresentationsAtPath(path);

        foreach (Sprite sprite in sprites)
        {
            if (spriteRect == sprite.rect)
            {
                this.sprite = sprite;
                EditorUtility.SetDirty(this);
                break;
            }
        }
    }
#endif
}

用途

 マップチップなんかに使えるはず。

  • マップチップ画像はMutliSpriteで作成する。
  • マップチップ画像はあとでチップが追加されたりするので、開発中にSliceをやり直す機会が発生する。