Amazonで商品を見るセール会場へ

Unityでゴールに触れたらクリア文字を表示する方法|3D TriggerとUI

VRoidで作成したキャラクターが特定のオブジェクトに触れた際に、ゲームクリアの文字を表示する手順を解説します。

移動できるキャラクターと3D Colliderが用意できていることを前提に、接触判定とUI表示を追加します。

VRoidモデルの読み込み・移動処理は別途必要です。

掲載画像は旧作例で、今回のコードをUnityでコンパイル・再現した画面ではありません。

所要時間は環境によって異なります。

目次

ゴールオブジェクトの作成

  1. Hierarchy上で右クリックし、「3D Object」→「Sphere」から球体を作成して適当な大きさに調整します。
  2. Projectウィンドウで右クリックし、「Create」→「Material」を選択してマテリアルを作成します。
  3. まず現在の描画パイプラインに対応する通常のマテリアルで試します。旧画像の「Particles → Alpha Blend」は半透明の見た目の例で、接触判定に必須の設定ではありません。URP・HDRPで同じシェーダーを探す必要はありません。
マテリアルの設定

作成したMaterialを球体にドラッグ&ドロップすると、見た目が反映されます。

マテリアル適用後の見た目
スポンサーリンク

ゴールオブジェクトの設定

ゴールオブジェクトの設定
  1. 作成したオブジェクトを選択し、Sphere Colliderの「Is Trigger」にチェックを入れます。
  2. Inspectorの「Add Component」から「Rigidbody」を検索して追加します。
  3. Rigidbodyの「Use Gravity」をOFF、「Is Kinematic」をONにします。固定ゴールが物理力で動かない構成です。

キャラの設定

キャラの設定
  1. 接触するColliderのあるGameObject、またはそのColliderが属するRigidbodyのGameObjectのTagを「Player」にします。タグは子へ自動継承されません。下のコードはこの2箇所を判定します。
  2. キャラクターが床と衝突するためのCapsule ColliderはIs TriggerをOFFのままにします。ゴール側がTriggerなので、両方をTriggerにする必要はありません。既存の移動用RigidbodyやCharacterControllerを不用意に重複追加しないでください。

このコードは、Playerタグを任意の親オブジェクトまで順に探す処理ではありません。

親にタグがあっても、その親に所属Rigidbodyがなく、接触するColliderにもタグがなければ対象外です。

子Colliderを使う構成では、そのColliderか所属RigidbodyのGameObjectにPlayerタグがあるか確認してください。

テキストの表示

テキストの表示
  1. Canvas内にUIテキストを作ります。旧画像はUI → Textですが、現在の環境ではTextMeshProのUIテキストでも構いません。このコードはGameObjectの表示を切り替えるため、文字コンポーネントの型には依存しません。
  2. 作成したオブジェクトの名前を「GoalText」にし、テキストの内容へ「Clear!」を入力します。Canvasは有効にし、GoalTextをゴールとは別の階層へ置いてください。
  3. Width、Height、Font Size、Colorなどを変更し、文字の位置と見た目を調整します。
テキストの設定

コードの追加

キャラクターが球体に触れたら文字が表示されるスクリプトをアタッチします。

スクリプトの追加
  1. 球体オブジェクトを選択し、「Add Component」から「New script」を選択します。
  2. 名前を「GameController」と入力し、「Create and Add」をクリックして追加します。
  3. 追加されたGameControllerスクリプトをダブルクリックしてエディタを開きます。
Visual Studioでの編集

ファイル名をGameController.csとして以下のコードを保存します。

既存プロジェクトに同名クラスがある場合は、ファイル名とクラス名を一緒に変えます。

コードと公式APIの照合を行った実装例で、コンパイル・実機動作は未検証です。

using UnityEngine;

public class GameController : MonoBehaviour
{
    public GameObject GoalText;
    private bool cleared;

    void Awake()
    {
        if (GoalText == null)
        {
            Debug.LogWarning("Goal TextにUIを割り当ててください。", this);
            enabled = false;
            return;
        }
        GoalText.SetActive(false);
    }

    private void OnTriggerEnter(Collider other)
    {
        if (!isActiveAndEnabled || cleared || GoalText == null) return;
        Rigidbody body = other.attachedRigidbody;
        bool isPlayer = other.CompareTag("Player")
            || (body != null && body.CompareTag("Player"));
        if (!isPlayer) return;

        cleared = true;
        GoalText.SetActive(true);
    }
}

Sphereを選択し、InspectorのGameControllerコンポーネントにあるGoal Text欄へ、作成したGoalTextをドラッグ&ドロップで割り当てます。

Goal Textの登録

Goal Textが未設定のまま再生すると、警告を出してGameControllerを無効にします。

停止して参照を割り当て、再生し直す手順で確認してください。

ゲームプレイテスト

ゲームプレイテスト

再生直後はGoalTextが非表示になり、Playerがゴールへ入ったときだけ「Clear!」が表示されることを確認します。

Player以外では表示されないこと、複数のColliderや再接触で処理が重複しないことも試します。

表示後に消す機能やゲーム進行の停止は含めていません。

Windowsの既定ショートカットでカメラの位置を合わせる際は、Sceneビューで視点を決めた後にカメラを選択し、Ctrl+Shift+Fを押すとSceneビューの視点をカメラに反映できます。

Unityのほかの記事は、まとめからご覧いただけます。

旧版コードはGitHubのMOTOKI-LLC/cg-method-codeにもありますが、今回の修正コードとの同期は確認していません。

このページのコードを基準にしてください。

Unityの基礎と学習の記事は、ほかにもあります。

表示されない・もう一度試せないとき

GoalText自身が有効でも、親Canvasが無効なら文字は表示されません。

SetActive(true)は親を自動で有効にする操作ではないため、階層全体の有効状態を確認します。

一度クリアした後は、コードのclearedがtrueのまま残ります。

同じGameControllerを無効化して再度有効化するだけでは、クリア判定はリセットされません。

再テストはシーンを再読み込みするなど、新しいGameControllerで初期状態から行ってください。

同じインスタンスでリトライするゲームでは、文字の非表示とクリア状態を戻す処理を別途用意します。

スポンサーリンク

まとめ

  • ゴールにIs TriggerをONにした3D Colliderと、Is KinematicをONにしたRigidbodyを設定
  • 接触するキャラのColliderまたは所属RigidbodyのGameObjectにPlayerタグを設定
  • OnTriggerEnterでタグを判定してテキストを表示

参考:https://digilab.tech/unityコライダーでゴールを作成する/

2026年10月26日にUnity 6.3の公式APIのOnTriggerEnter、attachedRigidbody、SetActiveを照合しました。

反応しない場合はConsole、参照、3D Colliderとレイヤー間の衝突設定を確認してください。

文字だけ出ない場合はCanvasと親の有効状態も確認します。

Collider2Dはこのコードの対象外です。

次に学ぶ・作業環境を選ぶ

学習を続けたい方や、作業環境を整えたい方は、目的に合うガイドをご覧ください。

Unityのおすすめ書籍

開発PCの選び方

周辺機器の優先度

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次