さけのさかなのブログ

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

スプライトアニメーションを使いまわす法

概要

 Unityの標準機能で、Spriteの切り替わりによるパタパタアニメーションを実装することができる。

 が、たとえば複数のキャラクター画像で同じアニメーションを使いたいとき、どうするか。

 (Unity5.2.0b4)

1.Spriteを紐づける

 ベースになるスプライトアニメーションがあるとして、そこに使われるスプライトから別キャラクターのスプライトに変換する処理を書けば良い。

 ざっくりとしたイメージとしてはこんな感じ。

// キャラごとに設定する部分
Directory<Sprite, Sprite> map = {
    {A_idle_0, B_idle_0},
    {A_idle_1, B_idle_1},
    {A_idle_2, B_idle_2},
    {A_idle_3, B_idle_3},
    {A_walk_0, B_walk_0},
    {A_walk_1, B_walk_1},
    {A_walk_2, B_walk_2},
    {A_walk_3, B_walk_3},
}

void LastUpdate()
{
    spriteRenderer.sprite = map[spriteRenderer.sprite];
}

2.もうちょいマシに

 上記でもできるけど、元スプライトを常時読みこむ必要があってメモリ的に無駄があるので、もうちょいマシにする。

 何をするかというと、さっきSpriteからSpriteへの変換だったのを、TextAssetからSpriteへの変換にしてやる。

// これがAnimatorによって変更される
public TextAsset animationSymbol;

// キャラごとに設定する部分
Dictionary<TextAsset, Sprite> map = {
    {idle_0.txt, B_idle_0},
    {idle_1.txt, B_idle_1},
    {idle_2.txt, B_idle_2},
    {idle_3.txt, B_idle_3},
    {walk_0.txt, B_walk_0},
    {walk_1.txt, B_walk_1},
    {walk_2.txt, B_walk_2},
    {walk_3.txt, B_walk_3},
}

void LastUpdate()
{
    spriteRenderer.sprite = map[animationSymbol];
}

 こんな感じ。

 TextAssetの中身は空っぽで良い。軽いものとして選んだので。

 まあなんというか、ダサいよなー。無理やり感あって。

TextAsset以外の道

 ScriptableObjectが使えれば色々情報を仕込めるので理想的だったんだけど、AnimatorでScriptableObject型フィールドを変更することはできないのでダメ。

 Spriteに番号をつけて、float型フィールドをAnimatorで変更すればいいじゃん?とは思ったけど、たぶん補間で事故るのでやめた。