UnityのIs Triggerとは?設定方法と使い方を解説

unity

はじめに

Unityでゲームを作っていると、プレイヤーが特定の場所に入ったことを検知したり、物体に触れたことをきっかけに処理を実行したりする場面があります。

このような処理に利用できるのが、Colliderの**「Is Trigger」**です。

今回は、Is Triggerとは何なのか、通常のColliderとの違いや設定方法を確認します。

実際の使用例として、自動扉のように「特定のエリアに入ったら別のオブジェクトを動かす」という仕組みも紹介します。


Is Triggerとは?

Is Triggerは、Colliderに用意されている設定項目です。

ColliderのIs Triggerにチェックを入れることで、そのColliderをTriggerとして使用できます。

通常のColliderは、物体同士を衝突させるために使用します。

例えば、壁にColliderを設定すると、プレイヤーが壁にぶつかったときに、それ以上進めないようにできます。

一方、Is Triggerを有効にすると、物体を物理的に止めるのではなく、その領域に入ったことや接触したことを検知するために利用できます。

そのため、「プレイヤーがここに入ったら処理を実行する」といった仕組みを作ることができます。


通常のColliderとの違い

通常のColliderとTriggerの違いを簡単にまとめると、次のようになります。

設定主な役割
Is Trigger OFF物体同士を衝突させる
Is Trigger ON接触や侵入を検知する

例えば、プレイヤーが壁を通り抜けないようにしたい場合は、通常のColliderを使用します。

一方、プレイヤーが特定の場所に入ったことを検知したい場合は、Triggerを使用します。

つまり、

「ぶつけて止める」→ 通常のCollider

「入った・触れたことを検知する」→ Trigger

という使い分けができます。


Is Triggerを設定する

実際にIs Triggerを設定してみます。

まず、Triggerとして使用したいGameObjectを選択します。

今回はCubeを使用します。

InspectorにあるBox Colliderを確認すると、「Is Trigger」という項目があります。

ここにチェックを入れます。

これでCubeのColliderがTriggerとして扱われます。

設定自体は非常に簡単ですが、Is Triggerを有効にしただけでは、何かの処理が自動的に実行されるわけではありません。

Triggerに入ったことを検知して、その結果を利用するにはスクリプトなどを組み合わせます。


Triggerに入った・出たことを検知する

Is Triggerを設定したら、次にTriggerの範囲へ入ったときと、範囲から出たときを検知してみます。

OnTriggerEnter

OnTriggerEnterは、別のColliderがTriggerの範囲に入ったときに呼び出されます。

private void OnTriggerEnter(Collider other)
{
    // Triggerに入ったときの処理
}

例えば、Triggerに入ったことを確認するために、Debug.Logを使ってメッセージを表示できます。

Debug.Log("Triggerに入りました");

OnTriggerExit

OnTriggerExitは、別のColliderがTriggerの範囲から出たときに呼び出されます。

private void OnTriggerExit(Collider other)
{
    // Triggerから出たときの処理
}

こちらもDebug.Logを使えば、Triggerから出たことをConsoleで確認できます。

Debug.Log("Triggerから出ました");

全体のコード

今回は、プレイヤーがCube3のTrigger範囲に入ったときと、出たときにメッセージを表示します。

Cube3に以下のスクリプトを追加します。

using UnityEngine;

public class DoorTrigger : MonoBehaviour
{
    private void OnTriggerEnter(Collider other)
    {
        Debug.Log("Triggerに入りました");
    }

    private void OnTriggerExit(Collider other)
    {
        Debug.Log("Triggerから出ました");
    }
}

ゲームを実行してプレイヤーがCube3の範囲に入ると、Consoleに「Triggerに入りました」と表示されます。

その後、範囲から出ると「Triggerから出ました」と表示されます。

このように、OnTriggerEnterOnTriggerExitを使うことで、Triggerに入った・出たタイミングを検知できます。

まずはこの方法でTriggerが正しく反応することを確認し、次はこの仕組みを利用して簡単なギミックを作ってみます。


実際に使ってみる

ここでは、Is Triggerの使用例として、自動扉を使って確認します。

今回はそれぞれ、

  • Cube2:動かすオブジェクト
  • Cube3:Triggerとして使用する開閉エリア

という役割にします。

Cube3のBox ColliderでIs TriggerをONにします。

そして、プレイヤーがCube3の範囲に入ったことをOnTriggerEnterで検知し、Cube2を動かします。

例えば、Cube2を右方向へ移動させる場合は、先ほどのスクリプトにオブジェクトを移動させる処理を追加します。

using UnityEngine;

public class DoorTrigger : MonoBehaviour
{
    public GameObject door;

    private void OnTriggerEnter(Collider other)
    {
        door.transform.position += new Vector3(2, 0, 0);
        Debug.Log("Triggerに入りました");
    }

    private void OnTriggerExit(Collider other)
    {
        door.transform.position += new Vector3(-2, 0, 0);
        Debug.Log("Triggerから出ました");
    }
}

InspectorのDoorには、HierarchyにあるCube2を設定します。

これで、プレイヤーがCube3の範囲に入ると、Cube2が右方向へ移動します。

この例では自動扉として使用していますが、重要なのはTriggerに入ったことをきっかけに、別の処理を実行できるという点です。

今回はTriggerの動作を確認するため、Triggerに入った瞬間にオブジェクトを移動させています。滑らかに移動させる場合は、毎フレーム少しずつ移動させる処理が必要です。


Rigidbodyも確認する

Triggerを使用する場合は、ColliderだけでなくRigidbodyについても確認します。

Triggerのイベントを発生させるには、接触するオブジェクトの少なくとも一方にRigidbodyが必要です。

今回のようにプレイヤーがTriggerの範囲に入る場合は、プレイヤー側にRigidbodyが設定されていることを確認します。

Colliderは主に当たり判定の形を作るために使用し、Rigidbodyは物理演算に関係するコンポーネントです。

それぞれ役割が異なるため、目的に合わせて組み合わせて使用します。


Is Triggerを使う場面

Is Triggerは、自動扉以外にもさまざまな場面で利用できます。

例えば、

  • ゴール地点に入ったことを検知する
  • アイテムに触れたことを検知する
  • 特定のエリアへの侵入を検知する
  • 敵の攻撃範囲を検知する
  • 特定のイベントを発生させる

などがあります。

このように、Triggerは**「何かがその場所に入ったこと」をゲーム内の処理につなげる**ために利用できます。

まとめ

今回は、ColliderのIs Triggerについて確認しました。

Is Triggerを有効にすると、Colliderを物体同士を衝突させるためではなく、接触や侵入を検知するための領域として利用できます。

通常のColliderとの違いは、

  • Is Trigger OFF:物体同士を衝突させる
  • Is Trigger ON:接触や侵入を検知する
  • OnTriggerEnter:Triggerに入ったことを検知する
  • OnTriggerExit:Triggerから出たことを検知する

という点です。

今回は使用例として自動扉を紹介しましたが、Triggerをきっかけに別のオブジェクトを動かしたり、イベントを発生させたりするなど、さまざまな使い方ができます。

Colliderの「衝突」とTriggerの「検知」の違いを理解しておくと、ゲーム内の仕組みを作る際に使い分けやすくなります。