UnityでRaycastを使ってアニメーションを再生する方法

Unity

はじめに

Unityでは、Raycastを利用することで、指定した方向にあるオブジェクトを検知できます。

今回は、プレイヤーのカメラからRaycastを飛ばし、ドアに当たった状態でマウスの左クリックをすると、ドアが開くアニメーションを再生する方法を紹介します。

Animatorの設定方法については前回の記事と共通する部分があるため、今回はRaycastによる判定方法とスクリプトの設定を中心に解説します。


ドアの準備とAnimatorの設定

今回は、ドアにColliderとAnimatorを設定し、開くアニメーションを再生できる状態にします。

Colliderの設定やアニメーションクリップの準備、Animatorのステートや遷移条件の設定方法については、以下の記事で詳しく紹介しています。

UnityでIs Triggerに入ったときにアニメーションを再生する方法
UnityでIs Triggerに入ったときにアニメーションを再生する方法を解説。Playerタグの設定からAnimatorのステートや遷移条件、スクリプトの実装まで紹介します。

今回は前回の記事と同じように、CloseとOpenのステートを作成し、TriggerパラメーターにOpenDoorを設定します。

ドアの準備ができたら、Raycastを使ったオブジェクトの判定を行います。


Raycastでオブジェクトを判定する

次に、プレイヤーのカメラからRaycastを飛ばし、ドアに当たったかどうかを判定します。

Raycastの基本的な仕組みや使い方については、以下の記事で紹介しています。

UnityでRaycastを使ってオブジェクトを検知する方法
UnityのPhysics.Raycastを使って、プレイヤーの前方にあるオブジェクトを検知する方法を紹介します。Rayの方向や距離の指定、Debug.DrawRayを使った確認方法も解説します。

今回は、カメラの正面方向にRaycastを飛ばし、一定の距離内にあるドアを判定できるようにします。


スクリプトを作成する

次に、Raycastでドアを判定し、左クリックしたときにAnimatorのTriggerパラメーターを呼び出すスクリプトを作成します。

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

using UnityEngine;
using UnityEngine.InputSystem;

public class RaycastDoorController : MonoBehaviour
{
    public Camera playerCamera;
    public float rayDistance = 3f;

    private void Update()
    {
        if (Mouse.current == null ||
            !Mouse.current.leftButton.wasPressedThisFrame)
        {
            return;
        }

        Ray ray = new Ray(
            playerCamera.transform.position,
            playerCamera.transform.forward
        );

        if (Physics.Raycast(ray, out RaycastHit hit, rayDistance))
        {
            Animator doorAnimator =
                hit.collider.GetComponentInParent<Animator>();

            if (doorAnimator != null)
            {
                doorAnimator.SetTrigger("OpenDoor");
            }
        }
    }
}

スクリプトの処理について

Mouse.current.leftButton.wasPressedThisFrameは、マウスの左ボタンを押した瞬間に処理を実行するための記述です。

次に、Rayを作成します。

Ray ray = new Ray(
    playerCamera.transform.position,
    playerCamera.transform.forward
);

カメラの位置を始点にして、カメラの正面方向へRayを飛ばします。

次に、Physics.Raycastでオブジェクトに当たったかどうかを判定します。

if (Physics.Raycast(ray, out RaycastHit hit, rayDistance))

RaycastがColliderに当たった場合、条件が成立します。

rayDistanceはRaycastの判定距離です。今回は3に設定しています。

続いて、当たったオブジェクトからAnimatorを取得します。

Animator doorAnimator =
    hit.collider.GetComponentInParent<Animator>();

GetComponentInParentを使用することで、Colliderが付いているオブジェクトだけでなく、その親オブジェクトに設定されているAnimatorも取得できます。

最後に、Animatorが取得できた場合はTriggerを呼び出します。

doorAnimator.SetTrigger("OpenDoor");

これにより、AnimatorのCloseからOpenへ遷移し、ドアが開くアニメーションが再生されます。


スクリプトを設定する

作成したRaycastDoorController.csをPlayerにアタッチします。

Inspectorで、次の項目を設定します。

  • Player Camera:プレイヤーのカメラを設定
  • Ray Distance:3

Ray Distanceは、Raycastで判定する距離です。必要に応じて調整してください。

ドアには、AnimatorとColliderが設定されていることを確認します。


動作を確認する

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

プレイヤーのカメラをドアに向け、マウスの左クリックを押します。

ドアにRaycastが当たっている状態でクリックすると、ドアが開くアニメーションが再生されます。

ドア以外の場所をクリックした場合は、Animatorが取得されないため、アニメーションは再生されません。

なお、動画では左クリックしたタイミングが分かるように、スクリプトにDebug.Log()を追加してConsoleにメッセージを表示しています。


まとめ

今回は、UnityでRaycastを使ってアニメーションを再生する方法を紹介しました。

Raycastでカメラの正面にあるオブジェクトを判定し、クリックしたときにAnimatorのTriggerパラメーターを呼び出すことで、アニメーションを再生できます。

この仕組みは、ドアを開ける動作だけでなく、プレイヤーがオブジェクトを選択したときにアニメーションを再生する場合にも応用できます。