UnityでIs Triggerに入ったときにアニメーションを再生する方法

Unity

はじめに

Unityでは、ColliderのIs Triggerを利用することで、オブジェクトが特定の範囲に入ったことを検知できます。

今回は、プレイヤーがTriggerの範囲に入ると、ドアが開くアニメーションを再生する方法を紹介します。

Triggerの設定に加えて、Animatorのステートや遷移条件、スクリプトの設定も行います。


Triggerを設定する

ドアの前にTriggerを配置し、プレイヤーが範囲に入ったことを検知できるようにします。

Is Triggerの設定方法や、Triggerに入ったときの検知方法については、以下の記事で紹介しています。

UnityのIs Triggerとは?設定方法と使い方を解説
UnityのIs Triggerとは何か、Colliderとの違いや設定方法を解説します。OnTriggerEnter・OnTriggerExitを使った検知方法や、自動扉を例に基本的な使い方を紹介します。

Playerタグを設定する

スクリプトでプレイヤーを判定するため、Colliderが付いているGameObjectのTagをPlayerに設定します。

  1. HierarchyでプレイヤーのColliderが付いているGameObjectを選択します。
  2. Inspector上部のTagを開き、Playerを選択します。

Rigidbodyが付いた親オブジェクトと、Capsule Colliderが付いた子オブジェクトを分けている場合は、Colliderが付いた子オブジェクトにもPlayerタグを設定してください。

スクリプトでは、このタグを使ってTriggerに入ったオブジェクトがプレイヤーかどうかを判定します。


ドアのアニメーションを準備する

今回は、ドアが開くアニメーションクリップを使用します。

アニメーションの再生方法については、以下の記事で紹介しています。

Blenderで作成したアニメーションをUnityで実装する方法
Blenderで作成したアニメーションをUnityで使用する方法を紹介します。Animation ClipやAnimator Controllerの基本的な設定と、アニメーションを再生するまでの流れを紹介します。

Animatorを設定する

次に、Triggerに入ったときにアニメーションが再生されるようにAnimatorを設定します。

ステートを作成する

まず、ドアが閉じた状態で待機するCloseステートを作成します。

  1. Animatorウィンドウの何もない場所を右クリックします。
  2. Create State → Emptyを選択します。
  3. 作成されたステートの名前をCloseに変更します。

Closeは空のステートとして作成するため、アニメーションクリップを設定する必要はありません。

次に、ドアが開くアニメーションクリップをAnimatorウィンドウにドラッグ&ドロップし、Openステートを作成します。

これで、ドアが閉じた状態で待機するCloseと、ドアが開くアニメーションを再生するOpenの2つのステートを用意できます。


デフォルトステートを設定する

Closeを右クリックし、Set as Layer Default Stateを選択します。

Closeがオレンジ色で表示され、Entryから接続されていれば設定完了です。

最初からCloseがオレンジ色のデフォルトステートになっている場合は、設定を変更する必要はありません。

これにより、Animatorが開始したときに、最初はCloseのステートから始まります。


Triggerパラメーターを追加する

AnimatorウィンドウのParametersタブを開き、+ボタンからTriggerを追加します。

パラメーター名は、次のように設定します。

OpenDoor

この名前は、後ほどスクリプトで指定する名前と一致させてください。


CloseからOpenへ遷移させる

  1. AnimatorのCloseを右クリックします。
  2. Make Transitionを選択します。
  3. Openをクリックして接続します。
  4. 作成した白い矢印(ステート間の遷移)を選択します。

Inspectorで、次のように設定します。

  • Has Exit Time:チェックを外す
  • Conditions:OpenDoorを追加する

これで、OpenDoorのTriggerが呼び出されたときに、CloseからOpenへ遷移するようになります。

EntryからOpenへ直接接続するのではなく、CloseからOpenへの遷移に条件を設定することがポイントです。


スクリプトを作成する

次に、Triggerに入ったことを検知し、AnimatorのTriggerパラメーターを呼び出すスクリプトを作成します。

今回は、DoorAnimationController.csという名前で作成します。

using UnityEngine;

public class DoorAnimationController : MonoBehaviour
{
    public Animator doorAnimator;

    private void OnTriggerEnter(Collider other)
    {
        if (other.CompareTag("Player"))
        {
            doorAnimator.SetTrigger("OpenDoor");
        }
    }
}

OnTriggerEnterは、別のColliderがTriggerの範囲に入ったときに呼び出されるメソッドです。

CompareTag("Player")でプレイヤーかどうかを判定し、プレイヤーが入った場合にSetTrigger("OpenDoor")を実行します。

この処理によって、Animatorに設定したCloseからOpenへの遷移が発生します。


スクリプトを設定する

  1. DoorTriggerにDoorAnimationController.csをアタッチします。
  2. InspectorのDoor Animatorに、ドアのアニメーションを制御しているAnimatorを設定します。

これで、スクリプトからAnimatorを操作できるようになります。


動作を確認する

設定ができたら、Unityの再生ボタンを押して動作を確認します。

プレイヤーがIs Triggerを設定した範囲に入ると、ドアが開くアニメーションが再生されます。


まとめ

今回は、UnityでIs Triggerに入ったときにドアのアニメーションを再生する方法を紹介しました。

Is Triggerでプレイヤーの接近を検知し、スクリプトからAnimatorのTriggerパラメーターを呼び出すことで、特定のタイミングでアニメーションを再生できます。

この仕組みは、ドアを開く動作だけでなく、プレイヤーが特定の範囲に入ったときに演出を再生する場合にも応用できます。