# アニメーションを追加

Timmy がずっと「T-ポース」でなかなか面白くないので、走るときとジャンプの時もアニメーションを再生しましょう。このため「アニメーションコントローラー」（Animation Controller）および「アニメーター」(Animator) コンポーネントを使用し、条件でアニメーションを切り替えて、主人公を適切に動かしましょう。

## シーン設定

動くのは Timmy なので、Timmy (Playerではなく) に Animator コンポーネントを追加してください。

![image.png](https://class.illogic.games/uploads/images/gallery/2026-05/scaled-1680-/32wimage.png)

ここで、「Controller」と「Avatar」を設定しないといけない。

#### Controller とは

Controller（アニメーションコントローラー）はアニメーションの遷移を管理するところである。以下のような画面でアニメーションを挿入し、「Transition」（遷移）で、アニメーションの切り替えが管理できるものである。

![image.png](https://class.illogic.games/uploads/images/gallery/2026-05/scaled-1680-/cmQimage.png)

Timmy のコントローラーがまだできていないので、新しいのを作りましょう。Characters / Timmy / Animations の中で新しい「アニメーション ➡ アニメーションコントローラー」を作成し、「TimmyController」の名前にしてください：

![image.png](https://class.illogic.games/uploads/images/gallery/2026-05/scaled-1680-/zlCimage.png)

これを「Animator」コントローラーの「Controller」に設定ください。

#### Avatar とは

Avatar は、3Dモデルの「<span class="HwtZe" lang="ja"><span class="jCAhz"><span class="ryNqvb">骸骨</span></span></span>」（<span class="HwtZe" lang="ja"><span class="jCAhz ChMk0b"><span class="ryNqvb">スケルトン</span></span></span>）である。アバターの「骨」（ボーン）を動かすことにより、モデルが正しく変形する。この情報3Dモデルのデザイナーさんが作るべき。開発者はモデルからデータを抽出するだけ。プロジェクトフォルダでTimmyのモデルを選択しましょう（Characters / Timmy / Models / Timmy）

![image.png](https://class.illogic.games/uploads/images/gallery/2026-05/scaled-1680-/fwIimage.png)

ここで「Rig」を確認しましょう。このモデルからアバターを作るので、いくつかの設定を変えないといけない。

- Animation Type：Generic から Humanoid に更新（一般 → 人間っぽい）
- Avatar Definition：No Avatar から Create From This Model （アバターなし → このモデルから作成）

![image.png](https://class.illogic.games/uploads/images/gallery/2026-05/scaled-1680-/Ns6image.png)

その後は「Apply」ボタンを押してください。大きく変わらないが、ボーンを確認ができる。「Configure」ボタンを押すと

![image.png](https://class.illogic.games/uploads/images/gallery/2026-05/scaled-1680-/3ORimage.png)

アバターが抽出されたことが確認ができる。アバターができたので、Timmy の Animator コンポーネントの Avatar を設定しましょう

![image.png](https://class.illogic.games/uploads/images/gallery/2026-05/scaled-1680-/uIPimage.png)

#### アニメーションファイルのアバターも！

これで、キャラクターの骸骨（アバター）を設定できたが、次に、このモデルが使うアニメーションにもアバターの設定が必要。Characters / Timmy / Animation の中にいろんなファイルが入っているが、TimmyController 以外はすべてアニメーションである：

![image.png](https://class.illogic.games/uploads/images/gallery/2026-05/scaled-1680-/ynkimage.png)

このアニメーションは「Timmyのアニメーションだよ！」を指定するために、このファイルに作ったばかりのアバターを指定しなければならない。すべてのアニメーションを選択し、また「Rig」を確認しましょう。ここでは

- Animation Type：Generic から Humanoid に更新（一般 → 人間っぽい）
- Avatar Definition：No Avatar から Copy From Other Avatar（アバターなし → 他のアバターからコピーする）
- Source：TimmyAvatar を選択し、同じアバターを利用

![image.png](https://class.illogic.games/uploads/images/gallery/2026-05/scaled-1680-/87rimage.png)

最後に、「Apply」を押してください。これで、アニメーションファイルと Timmy の3Dモデルの紐づけができる。

## アニメーション

### 待機／アイドル（Idle）

まず、キャラクターが何もしてないときのアイドルアニメーションを作成しましょう。コントローラーの中に「idle」のアニメーションをドラッグドロップで追加

![image.png](https://class.illogic.games/uploads/images/gallery/2026-05/scaled-1680-/bsTimage.png)

今回のアニメーションが Mixamo からダウンロードしたので、アニメーションの名前は「mixamo\_com」になってしまう。これでわかりにくいので、Inspector で「Idle」という名前にしましょう。これがデフォルトアニメーションになるので、このままで実行してみましょう：

![image.png](https://class.illogic.games/uploads/images/gallery/2026-05/scaled-1680-/Kvqimage.png)

「T-ポーズ」ではなく、待機アニメーションになった！ただし、少し長めに待つと、アニメーションが止まってしまいます。なぜなら、デフォルトとしてアニメーションがループしないから。プロジェクトで「idle」を選択し「Animation」の設定を Inspector で更新しましょう：

![image.png](https://class.illogic.games/uploads/images/gallery/2026-05/scaled-1680-/821image.png)

ここで「Loop Time」のチェックが外しているため、アニメーションがループはしない。チェックを入れ、もう一度確認しましょう。

### 走る（Running）

つぎに、走るアニメーションを追加しましょう。プロジェクトから「running」をアニメーションコントローラーに追加し、アニメーション名を「Running」にしましょう。<span style="text-decoration: underline;">このアニメーションもループできるように設定を変えてくださいね</span>。

![image.png](https://class.illogic.games/uploads/images/gallery/2026-05/scaled-1680-/GGcimage.png)

次、遷移（Transition）を作らないといけない。Idle → Running と Running → Idle それぞれの遷移を「右クリック」→「Make Transition」で作成しましょう：

[![image.png](https://class.illogic.games/uploads/images/gallery/2026-05/scaled-1680-/l5fimage.png)](https://class.illogic.games/uploads/images/gallery/2026-05/l5fimage.png)

これで実行すると、待機→走る→待機 の繰り返しが続ける。走り始めると、Idle → Running の遷移し、止まったら Running → Idle に戻るようにしましょう。そのため、「今走っているのか？」のパラメータを追加しましょう。アニメーターコントローラーで Bool 型の IsRunning のパラメータを追加してください：

![image.png](https://class.illogic.games/uploads/images/gallery/2026-05/scaled-1680-/iXYimage.png)

これが遷移するかしないかのパラメータにしましょう。Idle → Running で IsRunning は true だったら、遷移する。そして、Running → Idle には、 IsRunning が false の時遷移しましょう：

<table border="1" id="bkmrk--15" style="border-collapse: collapse; width: 100%; border-width: 0px;"><colgroup><col style="width: 49.0857%;"></col><col style="width: 50.9918%;"></col></colgroup><tbody><tr><td style="border-width: 0px;">![image.png](https://class.illogic.games/uploads/images/gallery/2026-05/scaled-1680-/4Yyimage.png)

</td><td style="border-width: 0px;">[![image.png](https://class.illogic.games/uploads/images/gallery/2026-05/scaled-1680-/BIqimage.png)](https://class.illogic.games/uploads/images/gallery/2026-05/BIqimage.png)

</td></tr></tbody></table>

これで実行し、アニメーションコントローラーのパラメータ IsRunning を変えながら、挙動を確認してみてください。

#### 問題：すぐ遷移しない

これで問題が明らかになった。 IsRunning を変えても、すぐ遷移しない。アニメーションが終わってから遷移するので、反応が遅い。これを直すには、「アニメーション終了まで待たず、すぐ遷移しろ！」の設定すれば良いでしょう。遷移での「Has Exit Time」（終了時間あり）のチェックを外してください。

### スクリプト

最後は、C#からアニメーションコントローラーのパラメターを設定し、走っている間には IsRunning を true にしましょう。PlayerMove スクリプト移動の処理しているので、ここで簡単にパラメターを設定ができる。まず、Animator の参照が必要で：

```c#
// プレーヤーの移動を処理する
public class PlayerMove : MonoBehaviour
{
    // Unity で Animator の参照を設定
    [SerializeField]
    private Animator animator;

    // （省略）
}
```

そして、Update を少し更新するだけ：

```c#
private void Update()
{
    // 何も入力がない前提で、速度をゼロにする
    velocity = Vector3.zero;

    // Heightオブジェクトの向きを従って移動
    velocity += cameraYRot.right * Input.GetAxis("Horizontal");
    velocity += cameraYRot.forward * Input.GetAxis("Vertical");
    
    // 入力あれば、速度ベクトルはゼロではないはず
    bool isRunning = velocity != Vector3.zero;
    if (isRunning)
    {
        // 単位ベクトルにする
        velocity.Normalize();
        
        // 前方の向きを変える
        transform.forward = velocity;
        
        // 速度を乗算する
        velocity *= speed;
    }

    // アニメーターのパラメターを設定
    animator.SetBool("IsRunning", isRunning);
}
```

Unity で PlayerMove の Animator 参照を設定し、走ってみましょう！

### ジャンプ（Jump）

ジャンプは走るよりも多少複雑である。ジャンプの高さにより、アニメションの長さが変わるので、３つのパーツに分割されている

- ジャンプ開始（jumping up）：ジャンプが始まるときに再生
- 空中（falling idle）：高いところからジャンプすると、ずっとこのアニメーションを再生する
- 着陸：２種類がある 
    - 移動中の着陸：着地→転がって→立つ（falling to roll)
    - 停止中の着陸：着地→立つ（hard landing）

これで遷移が難しくなるが、少し考えて遷移を整理しましょう。**<span style="color: rgb(186, 55, 42);">赤は遷移のパラメター条件（Condition）</span>**

- 待機、または走行からジャンプキーを押すと、jumping upを再生（トリガー使用） 
    - Idle → **<span style="color: rgb(186, 55, 42);">\[JumpTrigger\]</span>** → JumpUp
    - Running →<span style="color: rgb(186, 55, 42);"> **\[JumpTrigger\]**</span> → JumpUp
- 現状が関係なく、空中だったら falling idle を再生 
    - Any State → **<span style="color: rgb(186, 55, 42);">\[IsAir == true\]</span>** → Falling
- 空中ではなくったら、かつ、走っていれば、転がる 
    - Falling → **<span style="color: rgb(186, 55, 42);">\[isAir == false\] \[isRunning == true\] </span>**→ Roll → Running
- 空中ではなくったら、かつ、止まっていれば、hard landing を再生 
    - Falling → **<span style="color: rgb(186, 55, 42);">\[isAir == false\] \[isRunning == false\] </span>**→ Land → Idle

まず、遷移図を作りましょう。アニメションを追加し、わかりやすい名前にしてください：

*※falling idle は ループするので、アニメションの設定を忘れずに*

![image.png](https://class.illogic.games/uploads/images/gallery/2026-05/scaled-1680-/tiCimage.png)

#### スクリプト

遷移とその条件ができたら、次、スクリプトでパラメターの設定が必要。ジャンプに関する処理が「PlayerJump」の中にあるので、そのスクリプトを編集しましょう。まず、アニメーターの参照から：

```c#
using UnityEngine;

// ジャンプ機能を追加するスクリプト
public class PlayerJump : MonoBehaviour
{
    // Unity で Animator の参照を設定
    [SerializeField]
    private Animator animator;

    // (省略)
}
```

そして、Update で：

```c#
void Update()
{
    // 着地なのか？
    bool onFloor = IsOnFloor();
    
    // ジャンプしたか？
    if (onFloor && Input.GetButtonDown("Jump"))
    {
        animator.SetTrigger("JumpTrigger");
        doJump = true;
    }
    
    // アニメーターのパラメター設定
    animator.SetBool("IsAir", !onFloor);
}
```

### 遷移の改善、微調整

これで各アニメションの再選、遷移の実現ができたが、違和感のときもある。転がるのが長いし、立つアニメションも長いので、着地のすぐ後にまた走り始めると、変に見える場合もある。以下の微調整で少し見かけが改善できる。

#### 転がるアニメーションを速くする

転がるのが長いので、スピードアップしましょう。アニメーターコントローラーで「Roll」のアニメーションを選択し、Inspector で Speed を調整してみましょう。1.5倍～2.5倍の間にお好みの数値で調整し、確かめてください。

![image.png](https://class.illogic.games/uploads/images/gallery/2026-05/scaled-1680-/fUsimage.png)

#### 着陸したと、また移動中かどうかを確認

以下のように遷移を調整し、Land か Roll の再生中に、走行の状況が変わったら、すぐ適切なアニメーションへ遷移する。

![image.png](https://class.illogic.games/uploads/images/gallery/2026-05/scaled-1680-/jDZimage.png)

#### ジャンプポーズでフリーズする

<table border="1" id="bkmrk-%E3%80%80%E3%82%B8%E3%83%A3%E3%83%B3%E3%83%97%E4%B8%AD%E3%81%AB%E3%80%81%E9%80%A3%E7%B6%9A%E3%81%AB%E3%82%B8%E3%83%A3%E3%83%B3%E3%83%97%E3%81%99%E3%82%8C%E3%81%B0%E3%80%81j" style="border-collapse: collapse; width: 100%; border-width: 0px;"><colgroup><col style="width: 50%;"></col><col style="width: 50%;"></col></colgroup><tbody><tr><td style="border-width: 0px;">![image.png](https://class.illogic.games/uploads/images/gallery/2026-05/scaled-1680-/rrvimage.png)</td><td style="border-width: 0px;"> ジャンプ中に、連続にジャンプすれば、JumpTrigger また発動し、結果として、JumpUp のアニメーションへ遷移し、そこで止まってしまいます。

 ジャンプができない場合は、JumpTrigger のパラメータをリセットすれば、この問題を解決ができる。

 以下のように、PlayerJump のスクリプトを修正すれば、直る：

</td></tr></tbody></table>

```c#
void Update()
{
    // 着地なのか？
    bool onFloor = IsOnFloor();

    // ジャンプしたか？
    if (onFloor && Input.GetButtonDown("Jump"))
    {
        // アニメータの"JumpTrigger"パラメータを設定
        animator.SetTrigger("JumpTrigger");
        doJump = true;
    }
    // そうじゃない場合は、リセットする
    else
        animator.ResetTrigger("JumpTrigger");

    
    // アニメーターのパラメター設定
    animator.SetBool("IsAir", !onFloor);
}

```