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プロジェクトに応用してみてください。
ディスカッション
コメント一覧
まだ、コメントがありません