CharacterControllerを使用したトリガー検知

Unityの CharacterController コンポーネントは、物理エンジンに依存しないキャラクターの移動を管理します。特に、物理的な衝突ではなく、トリガー領域における接触を検知する際には、OnTrigger 関連のメソッドを使用します。本資料では、 CharacterController を用いてトリガー検知を行い、その際にどのオブジェクトが検知したのか、どのオブジェクトが検知されたのかを表示する方法について説明します。

要件

  • Unity 2022以降(例: Unity 2022.3.4f1)
  • CharacterController がアタッチされたオブジェクト(Capsuleなど)
  • Collider と「Is Trigger」が設定されたオブジェクト(Sphereなど)

基本的なセットアップ

オブジェクトの準備

  • キャラクター(Capsule)
    Hierarchyウィンドウで Capsule オブジェクトを作成し、 CharacterController コンポーネントを追加します。
  • トリガーオブジェクト(Sphere)
    Sphere オブジェクトを作成し、 Sphere Collider コンポーネントの「Is Trigger」をオンにします。この設定により、Sphereは物理的な衝突ではなく、トリガーとして他のオブジェクトの接触を検知できるようになります。

シーン構成

CharacterController がトリガー検知を行う場合、物理的な衝突処理は不要ですが、その背景には CharacterController クラスの内部での制御があります。具体的に言えば、CharacterController クラスはUnityの物理エンジンの一部を使わず、独自のメカニズムでキャラクターの移動やトリガーの検知を行っています。

  1. CharacterController の物理エンジンとの連携CharacterController はRigidbodyのように物理エンジンを直接使わず、プレイヤーキャラクターの動きに特化したコンポーネントです。そのため、重力や加速度などの物理的な力の影響を受けません。代わりに、CharacterController.Move() や CharacterController.SimpleMove() メソッドを使って移動を制御しています。これらのメソッドを使用することで、物理演算なしにキャラクターを動かすことができ、トリガー検知などのイベントもUnityが処理してくれます。
  2. トリガーイベント (OnTrigger メソッド) の利用CharacterController は OnCollision 系の物理的な衝突を扱うメソッドをサポートしない一方で、OnTriggerEnterOnTriggerStayOnTriggerExit といったトリガーメソッドには対応しています。トリガーの検知は、Collider が「Is Trigger」に設定されている場合、CharacterController が内部的に他のオブジェクトとの接触を管理し、トリガーイベントを発生させます。これにより、Rigidbody なしでのトリガー検知が可能です。
  3. CharacterController の移動メカニズムCharacterController の移動は、物理エンジンの力による移動ではなく、スクリプトで指定された方向に直接的に移動させる仕組みです。例えば、CharacterController.Move() は、入力に応じたベクトルを指定してキャラクターをそのまま移動させます。これにより、重力や衝突の影響を受けずに移動が行われ、Collider やトリガーとの接触も処理されます。

CharacterController がトリガー検知をサポートする仕組み

CharacterController がトリガーをサポートする理由は、CharacterController 自体がUnityの内部で Colliderと連携しているためです。通常の Rigidbody を持つオブジェクトがトリガー検知を行う際も、Collider を使用しますが、CharacterController の場合もこの Collider に依存します。そのため、トリガーの検知に特化した動作は CharacterController 内でサポートされています。

まとめ

CharacterController は、物理エンジンに依存せずに移動を制御するため、Rigidbody が必要ありません。また、CharacterController 自体が Collider コンポーネントを介してトリガーの検知をサポートするため、トリガーイベント(OnTriggerEnterOnTriggerStayOnTriggerExit)を問題なく処理できます。

スクリプト

PlayerMovement.cs

以下のスクリプトを Capsule にアタッチして、 CharacterController による移動を実装します。キーボードの WASD キーを使ってキャラクターを動かすことができます。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerMovement : MonoBehaviour
{
    private CharacterController controller;
    public float speed = 5.0f;

    void Start()
    {
        controller = GetComponent<CharacterController>();
    }

    void Update()
    {
        // WASDキーでキャラクターを移動
        float moveX = Input.GetAxis("Horizontal") * speed * Time.deltaTime;
        float moveZ = Input.GetAxis("Vertical") * speed * Time.deltaTime;
        Vector3 move = new Vector3(moveX, 0, moveZ);

        // CharacterControllerによる移動
        controller.Move(move);
    }
}

TriggerCheck.cs

トリガー付きオブジェクト(Sphereなど)にこのスクリプトをアタッチして、トリガー領域に入ったオブジェクトを検知します。さらに、検知したオブジェクトと検知されたオブジェクトの名前を表示します。

using UnityEngine;

public class TriggerCheck : MonoBehaviour
{
    private void OnTriggerStay(Collider other)
    {
        // 検知したオブジェクト(this.gameObject)と、検知されたオブジェクト(other.gameObject)の情報を表示
        Debug.Log(this.gameObject.name + " が " + other.gameObject.name + " を検知しました。");
    }
}

実行手順

  1. プレイモード開始
    Unityエディタでプレイモードを開始します。
  2. キャラクターを移動
    WASD キーを使って Capsule キャラクターを移動させ、 Sphere のトリガーエリアに近づけます。
  3. トリガー検知の確認
    CapsuleSphere のトリガー領域に触れると、コンソールに「Sphere が Capsule を検知しました」というように、検知したオブジェクトと検知されたオブジェクトの情報が表示されます。

注意点

  • CharacterController を使用している場合、オブジェクトを直接 Transform で移動させるのではなく、必ず CharacterController.Move() で移動させる必要があります。
  • トリガーオブジェクトには Collider コンポーネントを追加し、必ず「Is Trigger」オプションをオンにしてください。
  • トリガーイベント(OnTriggerEnterOnTriggerStayOnTriggerExit)は物理的な衝突ではなく、トリガーゾーンへの侵入・滞在・退出を検知します。

終わりに

この資料では、 CharacterController を使用したトリガー検知と、検知したオブジェクトと検知されたオブジェクトの情報を表示する方法を紹介しました。この技術は、デバッグや複雑なシステムの挙動を確認する際に非常に役立ちます。ぜひ、自分のUnityプロジェクトに応用してみてください。

Unity,当たり判定

Posted by hidepon