バーチャル3Dクリエイター神部まゆみです(*^_^*)
この記事はUnityでダンジョンや建物に入る方法メモです。
動作させた最終バージョンはUnity 6000.0.32です。
やりたいこと:ダンジョンや建物の前に来たら「入る」UIを表示し、キーを押したらシーン遷移
以前会話システムを作った時にやった感じですね…。
これプレイヤーの機能として組み込んだほうが汎用性はありそうだけど、複数の村人が近くに来た時に見分ける処理も必要になるんですよね…。
スクリプトとしては簡単なヤツなので、とりあえずオブジェクトごとに仕込む感じにしようかと思います。
ChatGPT氏に聞いてみる
とりあえず彼に聞けばいいアイデアを出してくれるだろう…




フィールドのダンジョンにコライダーを設置しますから、そこに「入る」と表示する機能が欲しいです。キーを押すとシーン遷移します


了解です!じゃあ今の「話す」UIの仕組みと同じように、ダンジョンの入口にコライダーを設置して、プレイヤーが近づいたら「入る」UIを表示 → キーを押したらシーン遷移する形にしますね。
ダンジョン入口用スクリプト DungeonEntrance.cs
using UnityEngine;
using UnityEngine.SceneManagement;
public class DungeonEntrance : MonoBehaviour
{
public GameObject enterUI; // 「入る(E)」のUI
[SerializeField] private string dungeonSceneName = "DungeonScene"; // 遷移するシーン名
private bool canEnter = false;
void OnTriggerEnter(Collider other)
{
if (other.CompareTag("Player")) // プレイヤーが範囲内に入ったら
{
enterUI.SetActive(true);
canEnter = true;
}
}
void OnTriggerExit(Collider other)
{
if (other.CompareTag("Player"))
{
enterUI.SetActive(false);
canEnter = false;
}
}
void Update()
{
if (canEnter && Input.GetKeyDown(KeyCode.E))
{
SceneManager.LoadScene(dungeonSceneName);
}
}
}
🔧 設置方法
- ダンジョン入口に
GameObject
(Cubeなど)を配置 BoxCollider
を「Is Trigger」にするDungeonEntrance.cs
を入口のGameObject
にアタッチenterUI
に「入る(E)」のUIオブジェクトをセットPlayer
のタグを"Player"
に設定- 実行して、Eキーを押すとダンジョンシーンに遷移する
✅ これなら…
- 村人の会話UIと同じ方式だから管理が簡単
- 近づいたら UI 表示 → キー押したら遷移のシンプルな流れ
- ダンジョンの数が増えても、スクリプトを使い回せる
これで「入る」UIを簡単に設置できます!🎮
おお、割と簡単にできそうですね。
シーン遷移は以前やったことがあるから大丈夫かな。
とりあえず「入る」とUIを表示するところまでやる
とりあえずここまでやってみます。
フィールドにダンジョンを配置する
前回洞窟を作ったのであれを利用します。
↓地形は以前作ったので、丘や山の方に配置すればいいかな。
入り口は塞いでおいた方がいいかな。
本当は真っ暗な感じで洞窟の入り口っぽくしたいけどまぁ後で…。


コライダーを追加してトリガーにする
前回岩を作ったので、これを入り口に配置してスクリプトをアタッチしようと思います。
メッシュコライダーを追加、トリガーにする。
UIを追加して非表示にしておく
これは村人のやつで使ったやつをコピペします。
スクリプトをコピペしてアタッチ
スクリプトをコピペしてアタッチする。


これで表示できた!
これで表示できましたね。
シーン遷移についての基礎知識
これ気になってたけど、シーンが変わるとプレイヤーは原則別のインスタンス扱いになり、データの保持を考える必要があるっぽい。
まぁ今のところそこまでゲームとして作りこんでいないから、今のところは気にしないで行くけど。




例えばフィールドマップにいるプレイヤーがダンジョンに入った場合、フィールドマップにいるプレイヤーを別のシーンのダンジョンにワープさせているのではなく、ダンジョンにいるプレイヤーとはあくまで別のインスタンスになるのでしょうか?


結論から言うと、「通常のシーン遷移では、フィールドマップのプレイヤーとダンジョンのプレイヤーは別のインスタンスになる」のが一般的です。
つまり、ダンジョンに入ったとき、プレイヤーが新たに生成される形になるわけです。
🔹 なぜ別のインスタンスになるのか?
Unityのシーン遷移の仕組み
通常の SceneManager.LoadScene("Dungeon")
を実行すると、Unity は以下の処理を行います:
- 現在のシーン(フィールドマップ)の全オブジェクトを破棄
- 新しいシーン(ダンジョン)をロード
- ダンジョンシーンに配置されたプレイヤーが新たに生成される
このため、**フィールドマップにいたプレイヤーと、ダンジョンで動くプレイヤーは「見た目は同じでも別のオブジェクト」**ということになります。
🔹 別インスタンスになると困ること
通常のシーン遷移だとプレイヤーが「リセット」されるため、体力や装備、位置情報などが失われる可能性があります。
そこで、プレイヤーの情報を引き継ぐ方法が必要になります。
🔹 別インスタンスになっても問題なく引き継ぐ方法
✅ 方法1:PlayerPrefsでステータスを保存
シーンをまたいでもプレイヤーのステータスを保存できる。
✅ 方法2:GameManagerを使って情報を保持
「どのシーンでもプレイヤー情報を保持するオブジェクト」を作る。
✅ 方法3:プレイヤーを「DontDestroyOnLoad」にして同じインスタンスを使う
通常のシーン遷移ではプレイヤーは破棄されるが、DontDestroyOnLoad を使うと、同じプレイヤーをそのまま使い続けられる。
まぁとりあえず今回は遷移後のシーンにはプレハブ化しておいたプレイヤーを配置する感じにします。
言ってみれば、別シーンではプレイヤーのクローンが引き継ぐような感じですね。
後でDontDestroyOnLoadとかもやってみるかもしれない。
ダンジョンのシーンを新規作成、シーン遷移させる
とりあえずやってみます。
シーンをつくる
まぁとりあえず見栄えは気にせず適当に配置していきますw
プレハブ化したプレイヤーを配置する
前のシーンに戻ってプレイヤーをプレハブ化しておく。
プレハブは、まぁシーンで設定したオブジェクトを使いまわせる便利な機能、くらいに思っておけばだいたい間違いはないと思いますw
ダンジョンのシーンに戻ってプレイヤーを入り口あたりに配置します。
カメラが被るのでデフォルトのメインカメラは削除しておく
TPSゲームだとたぶんプレイヤー用のカメラがあると思うので、デフォルトで配置されてるメインカメラは削除しておきます。


私はJU TPS3アセットを使っているから新しいシーンでQuick Scene Setupをする必要があったけど、これはアセットによります。
新しいシーンになるのでまたセットアップし直す必要があります。


スクリプトのシーン名を書き換える
遷移前のシーンに戻り、Dungeon Entranceスクリプトのところの遷移先のシーン名を書き換えます。
洞窟の入り口に設置したやつね。


シーンをビルド設定に追加しておく
遷移前のシーンと遷移先のシーンを追加しておく。


これでできた!
これで動作しましたね。
動作しない場合:インプットシステムをBOTH(両方)に変える
今回のスクリプトは古い入力システムのやつを使ってるみたいなので、ここをBOTH(両方)に変えないと動かなかった。


後で新しい入力システムのやつもやってみます…。
おわりに
案外簡単にできて良かった。
とりあえずこういうのをたくさん作っていけばゲームっぽくなりそうかな…。
まぁもう少しいじってみます(*^_^*)