バーチャル3Dクリエイター神部まゆみです(*^-^*)
この記事はUnityでゴール判定の作り方を調べたメモです。
このページのやり方を実践すると、↓こんな感じの動作が作れます!
使用したバージョンはunity2022.3.22です。

やりたいこと プレイヤーがゴール地点に着いたら「ゴール!」と表示してエンディングBGMを流し、5秒後にスタート地点に戻る
とりあえずこれで最低限ゲームの体裁になりそうな気がする。
Starter AssetsのThird Person Controllerでプレイヤーを動かせるようになったので、ゴールに着いたら終了するようにしたいですね。
ChatGPT先輩に聞いてみる
優秀なChatGPT先輩に聞いてみますw


UnityでTPSゲームのゴール地点を設定し、ゴールに到達した際にエンディングBGMを流し、「ゴール!」と表示して、5秒後にスタート地点に戻るスクリプトを作成することができます。以下の手順とスクリプトを参考にしてください。
手順
①ゴール地点の設定 ゴール地点にはPlaneオブジェクトを配置し、Collider(例えばBox Collider)を追加します。
ゴール地点のPlaneオブジェクトには、Triggerとして動作するようにisTriggerをチェックします。②エンディングBGMの設定 エンディングBGMのAudioClipを用意し、AudioSourceコンポーネントに設定します。
③「ゴール!」の表示 「ゴール!」と表示するためのUI Textを作成します。
④スクリプトの作成 以下のスクリプトを作成し、ゴール地点のPlaneオブジェクトにアタッチします。
コードと設定方法
using System.Collections;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;
public class GoalTrigger : MonoBehaviour
{
public AudioClip endingBGM; // エンディングBGM
public Text goalText; // 「ゴール!」と表示するためのUI Text
private AudioSource audioSource;
void Start()
{
audioSource = gameObject.AddComponent<AudioSource>();
goalText.enabled = false; // 初めは非表示
}
void OnTriggerEnter(Collider other)
{
if (other.CompareTag("Player"))
{
StartCoroutine(HandleGoal());
}
}
private IEnumerator HandleGoal()
{
// 「ゴール!」と表示
goalText.enabled = true;
goalText.text = "ゴール!";
// エンディングBGMを再生
audioSource.clip = endingBGM;
audioSource.Play();
// 5秒待つ
yield return new WaitForSeconds(5f);
// シーンを再読み込みして最初からやり直す
SceneManager.LoadScene(SceneManager.GetActiveScene().name);
}
}
設定方法
①AudioClipの設定: スクリプトのendingBGMフィールドにエンディングBGMのAudioClipを設定します。
②UI Textの設定: スクリプトのgoalTextフィールドに「ゴール!」と表示するためのUI Textを設定します。
〇設定確認ポイント
・プレイヤーのタグ確認: プレイヤーのオブジェクトに「Player」タグが設定されていることを確認します。これにより、OnTriggerEnterメソッドでプレイヤーを正しく判別できます。
・SceneManagerのインポート確認: スクリプトの先頭にusing UnityEngine.SceneManagement;が追加されていることを確認します。
これで、プレイヤーがゴール地点に到達した際にエンディングBGMが流れ、「ゴール!」と表示され、5秒後にシーンが再読み込みされて最初からやり直すようになります。
おお、これでなんかできそうですね。
ChatGPT便利すぎるだろ…。
……しかしちょっと不具合があって何度かやりなおしたけどねw
単純にトランスフォームでスタート地点にワープさせようとしたらなぜか動作しなかったので、シーンを再読み込みしてスタート地点に戻す方式に変えました。
さっそくやってみる
さっそく実装していきます。
コライダーでゴール判定するオブジェクトを作る
キューブを追加して平ぺったくしてゴール地点にします。ちゃんと判定されるようにコライダーを大きくしておく。
このコライダーは終了判定に使うので、「トリガーにする」にチェックを入れる。


ゴール!と表示するUIを追加
ゲームオブジェクト ⇒ UI ⇒ キャンバス でキャンバスを追加。
キャンバスの上で右クリック、UI ⇒ 古い機能 ⇒ テキスト を追加。
これテキストメッシュプロだと確か表示する命令が違うんだったかな?
今回は古い機能になっている普通のテキストで表示します。
幅を大きくしてフォントサイズを100くらいにする。ゲーム画面で確認するとちゃんと表示されてますね。


ゴールに着くまでテキスト表示は必要ないので、テキストのところは空欄にしておきます。ゴールに着いたらスクリプトで「ゴール!」と表示されるので。
スクリプトを作ってGoalオブジェクトにアタッチする
作成 ⇒ C#スクリプト を選び、 GoalTrigger.cs という名前にする。C#はクラス名とファイル名を一致させないといけない。
記事上にあるコードをコピペして貼り付けて保存する。
Goalオブジェクトにアタッチして、ゴール表示するテキストとBGMファイルを指定する。BGMというか効果音(SE)みたいな感じだが…。
BGMはこちらのサイトから借りました。ありがとうございます(*^-^*)




動作確認してみる
ちゃんと行けた!※音が出ます
ゴールが近すぎるので遠くに持って行ってみる
ゴールにマテリアル設定して赤くし、上に持って行きました。
ここまで遠くすると少しはプレイ時間が伸びそうですw


これで動きました!(※音が出ます)
もっと広いフィールドにして、途中に敵が出てきたら十分ゲームになりそうですね。
おわりに
案外簡単にできて良かった。ChatGPT先輩のお陰だけど(;^_^A
これ舞台のアセットを用意してゴールまでできるだけ遠くして、途中に敵を配置すればもうそれだけでゲームとして成立しますね。
あとはムービーとか作ってストーリー性をもたせるとかすれば、割とゲームとして完成していきそうな気がする。
まぁこれでぼちぼち作っていってみます(*^-^*)