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の物理エンジンの一部を使わず、独自のメカニズムでキャラクターの移動やトリガーの検知を行っています。
CharacterControllerの物理エンジンとの連携:CharacterControllerはRigidbodyのように物理エンジンを直接使わず、プレイヤーキャラクターの動きに特化したコンポーネントです。そのため、重力や加速度などの物理的な力の影響を受けません。代わりに、CharacterController.Move()やCharacterController.SimpleMove()メソッドを使って移動を制御しています。これらのメソッドを使用することで、物理演算なしにキャラクターを動かすことができ、トリガー検知などのイベントもUnityが処理してくれます。- トリガーイベント (
OnTriggerメソッド) の利用:CharacterControllerはOnCollision系の物理的な衝突を扱うメソッドをサポートしない一方で、OnTriggerEnter、OnTriggerStay、OnTriggerExitといったトリガーメソッドには対応しています。トリガーの検知は、Colliderが「Is Trigger」に設定されている場合、CharacterControllerが内部的に他のオブジェクトとの接触を管理し、トリガーイベントを発生させます。これにより、Rigidbodyなしでのトリガー検知が可能です。 CharacterControllerの移動メカニズム:CharacterControllerの移動は、物理エンジンの力による移動ではなく、スクリプトで指定された方向に直接的に移動させる仕組みです。例えば、CharacterController.Move()は、入力に応じたベクトルを指定してキャラクターをそのまま移動させます。これにより、重力や衝突の影響を受けずに移動が行われ、Colliderやトリガーとの接触も処理されます。
CharacterController がトリガー検知をサポートする仕組み
CharacterController がトリガーをサポートする理由は、CharacterController 自体がUnityの内部で Colliderと連携しているためです。通常の Rigidbody を持つオブジェクトがトリガー検知を行う際も、Collider を使用しますが、CharacterController の場合もこの Collider に依存します。そのため、トリガーの検知に特化した動作は CharacterController 内でサポートされています。
まとめ
CharacterController は、物理エンジンに依存せずに移動を制御するため、Rigidbody が必要ありません。また、CharacterController 自体が Collider コンポーネントを介してトリガーの検知をサポートするため、トリガーイベント(OnTriggerEnter、OnTriggerStay、OnTriggerExit)を問題なく処理できます。
スクリプト
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 + " を検知しました。");
}
}
実行手順
- プレイモード開始
Unityエディタでプレイモードを開始します。 - キャラクターを移動
WASDキーを使ってCapsuleキャラクターを移動させ、Sphereのトリガーエリアに近づけます。 - トリガー検知の確認
CapsuleがSphereのトリガー領域に触れると、コンソールに「Sphere が Capsule を検知しました」というように、検知したオブジェクトと検知されたオブジェクトの情報が表示されます。
注意点
CharacterControllerを使用している場合、オブジェクトを直接Transformで移動させるのではなく、必ずCharacterController.Move()で移動させる必要があります。- トリガーオブジェクトには
Colliderコンポーネントを追加し、必ず「Is Trigger」オプションをオンにしてください。 - トリガーイベント(
OnTriggerEnter、OnTriggerStay、OnTriggerExit)は物理的な衝突ではなく、トリガーゾーンへの侵入・滞在・退出を検知します。
終わりに
この資料では、 CharacterController を使用したトリガー検知と、検知したオブジェクトと検知されたオブジェクトの情報を表示する方法を紹介しました。この技術は、デバッグや複雑なシステムの挙動を確認する際に非常に役立ちます。ぜひ、自分のUnityプロジェクトに応用してみてください。



ディスカッション
コメント一覧
まだ、コメントがありません