1. はじめに
こんにちは!今回もUnityで2D脱出ゲームを作っていきます。
前回までに部屋の移動やアイテムボックスの作成、アイテムを取得する仕組みを実装しましたね。
今回は「ドアの開閉」と「鍵やパスワードを使ったロック解除」を実装して、脱出ゲームらしいギミックを作っていきます!
今回実装する機能
✅ クリックでドアを開閉
✅ 鍵を持っているとドアが開く
✅ パスワードを入力してロック解除
脱出ゲームでは「ただ部屋を移動するだけ」ではなく、鍵やパズルを解いて進む要素が大切です。
これらの仕組みを取り入れることで、より本格的な脱出ゲームに仕上げていきましょう!
それでは、まずは「ドアの作成」から始めます!
2. ドアを作成しよう
脱出ゲームでは、ドアを開けることがゴールの一つになります。そこで今回は、クリックすると開閉するドア を作成します。
ドアの作成手順は以下のようになります。
- 閉じたドアの作成
- 開いたドアの作成
- クリックで開閉できるようにする
2-1. 閉じたドアを作成する
まず、閉じた状態のドアを作成しましょう。
room1の中にImageを作成します。- 名前を
Doorに変更します。 InspectorでSource Imageに 閉じたドアの画像 を設定します。Add ComponentからButtonコンポーネントを追加します。

👉 この設定で、ドアをクリックできるようになりました!
2-2. 開いたドアを作成する
次に、ドアを開いた状態の画像も作成します。

DoorをCtrl+Dで複製します。- 複製したオブジェクトの名前を
Door (Open)に変更します。 InspectorのSource Imageを 開いたドアの画像 に変更します。Door (Open)を 非アクティブ(非表示) にしておきます。InspectorでDoor (Open)の チェックを外す(SetActive(false)の状態にする)。

👉 これで、開いた状態のドアを用意できました!
2-3. クリックでドアを開閉する
作成した Door (Open) をクリックすると表示され、Door は非表示になるように設定します。
① スクリプトの作成
C#スクリプトを新規作成します。- 名前を
Objectにします。 - 作成したスクリプトを
Door (Open)にアタッチします。 - スクリプトを開き、以下のコードを入力します。
using UnityEngine;
public class Object : MonoBehaviour
{
public void OpenObject()
{
this.gameObject.SetActive(true);
}
public void CloseObject()
{
this.gameObject.SetActive(false);
}
}
② ボタンにスクリプトを設定
Doorの Buttonコンポーネント のOnClick()にDoor (Open)のOpenObject()を設定。Door (Open)の Buttonコンポーネント のOnClick()にCloseObject()を設定。

👉 これでクリックするとドアが開閉するようになります!
動作確認
ここまでの手順が完了したら、実際にプレイして動作を確認しましょう!
DoorをクリックするとDoor (Open)が表示されるか?Door (Open)をクリックするとDoorに戻るか?
うまくいかない場合は、以下をチェックしてください。 ✅ Door (Open) の SetActive が false になっているか?
✅ OnClick() に正しい関数が設定されているか?
2-4. まとめ
Door(閉じたドア)を作成し、ボタン機能を追加Door (Open)(開いたドア)を作成し、非表示に設定- スクリプトを作成し、クリックで開閉できるようにした

次のステップでは、鍵を使ってドアを開ける仕組みを作ります! 🔑
3. 鍵を使ってドアを開ける
脱出ゲームでは、「鍵を持っていないと開かないドア」を作るのが定番です。
今回は、プレイヤーが鍵を持っている場合のみドアを開けられる仕組みを実装します。
3-1. スクリプトを作成
まず、鍵を所持しているかを判定し、鍵を使ってドアを開くスクリプトを作成します。
① BlockObject スクリプトの作成
- プロジェクトウィンドウ を右クリック →
Create→C# Scriptを選択 - 名前を BlockObject に変更
BlockObjectを開き、以下のコードを入力
using UnityEngine;
using UnityEngine.Events;
public class BlockObject : MonoBehaviour
{
public Item.Type type = default; // 使用するアイテムの種類
public UnityEvent ClearIvent = default; // アイテムを使った後の処理
public void Onthis()
{
// アイテムを持っているか判定
bool hasItem = ItemBox.instance.CanUseItem(type);
if (hasItem == true)
{
// アイテムを使用(消費)
ItemBox.instance.UseItem(type);
// クリアイベントを実行(ドアを開ける)
ClearIvent.Invoke();
}
}
}
3-2. 鍵の使用設定
スクリプトができたら、次は Door に設定を行います。
① Door にスクリプトをアタッチ
- Hierarchyウィンドウ で
Doorを選択 Inspectorで Add Component をクリックBlockObjectを検索し、追加
② 使用するアイテムを設定
BlockObjectコンポーネントのTypeをKeyに設定
→InspectorのTypeドロップダウンリストでKeyを選択
③ 鍵を使ったときの動作を設定
BlockObjectのClearIventにDoor (Open)のOpenObject()を設定
設定手順:InspectorのClearIventの+ボタン をクリックDoor (Open)をHierarchyからドラッグして設定No FunctionをクリックしObject > OpenObject()を選択

3-3. ボタンの設定
次に、鍵を持っている時だけドアを開けるようにボタンを設定します。
① Door のボタンに Onthis() を設定
DoorのInspectorでButtonコンポーネントを開くOnClick()の+ボタンをクリックDoorをHierarchyからドラッグNo FunctionをクリックしBlockObject > Onthis()を選択

👉 これで、プレイヤーが鍵を持っている時だけドアが開くようになります!
3-4. 動作確認
✅ 鍵を持っている場合
鍵をクリックするとItemBoxに鍵が追加されるDoorをクリックすると、Door (Open)に切り替わる(ドアが開く!)
❌ 鍵を持っていない場合
Doorをクリックしても何も起こらない
🔍 Console に Debug.Log() を追加すると、アイテムがあるかどうかを確認できます。
public void Onthis()
{
bool hasItem = ItemBox.instance.CanUseItem(type);
Debug.Log("鍵を持っている? " + hasItem); // ← 追加
if (hasItem == true)
{
ItemBox.instance.UseItem(type);
ClearIvent.Invoke();
}
}
3-5. まとめ
BlockObjectスクリプトで「アイテムがある場合のみ使用できる」処理を実装ClearIventにDoor (Open)のOpenObject()を設定OnClick()にBlockObject.Onthis()を設定し、鍵がないと開かないドアを作成

これで、「鍵がないと開かないドア」 の仕組みが完成しました! 🎉
次は、4桁のパスワードロックを実装 して、より本格的なギミックを作りましょう!
4. 4桁のパスワードギミックを作成
脱出ゲームには、鍵だけでなくパスワードを入力してドアを開ける仕組みもよく使われます。ここでは 「4桁のパスワードを入力し、正解ならドアが開く」 というギミックを作成します。
4-1. UIでパスワード入力画面を作成
まず、パスワード入力画面のUIを作成していきましょう。
① パスワード入力画面のPanelを作成
Canvasの中にPanelを作成 し、名前をPasswordPanelに変更InspectorのRect Transformでサイズを調整(例:Width: 800, Height: 400)PanelのImageコンポーネントを 半透明(例:Alpha値 150) にして、パスワード画面らしくする
② パスワードのボタン配置
PasswordPanelの子オブジェクトとしてImageを作成(名前はPasswordGridにする)InspectorでRect Transformのサイズを調整Add ComponentからGrid Layout Groupを追加Cell Size(ボタンの大きさ):Width: 200, Height: 200Spacing(ボタンの間隔):X: 10, Y: 10Child Alignment:Middle Center
PasswordGridの子オブジェクトとしてButtonを4つ作成Buttonの名前はPasswordButton0,PasswordButton1,PasswordButton2,PasswordButton3に変更- 各ボタンに
Textを設定し、初期状態では"0"にしておく

③ パスワード入力画面を閉じるボタンを作成
PasswordPanelの子オブジェクトとしてButtonを作成(名前をClosePasswordPanelに変更)Textを"閉じる"に変更PasswordPanelは最初 非アクティブ にしておく(InspectorでActiveをfalseに)

4-2. スクリプトを作成
次に、パスワード画面の開閉処理をスクリプトで実装します。
- Panelに前に作成したObjectスクリプトをアタッチします。
③ OnClick() の設定
ClosePasswordPanelのOnClick()にPasswordPanelのCloseObject()を設定

次は 「ボタンを押すと数字が変わる仕組み」 を作成していきます。これにより、プレイヤーがボタンを押すことでパスワードを入力できるようになります!
5. ボタンを押すと文字が変わる仕組み
脱出ゲームでは、4桁のパスワードを入力して鍵を解除するギミックがよく使われます。ここでは、ボタンを押すたびに表示される文字を変更する仕組み を作ります。
5-1. スクリプトを作成
まず、新しい C#スクリプト を作成し、StringPassword と名前を付けます。
作成したスクリプトを開き、以下のコードを入力してください。
using UnityEngine;
using UnityEngine.UI;
public class StringPassword : MonoBehaviour
{
// ボタンに表示する文字
public string chars = "0123456789";
// ボタンのテキストを管理する配列
public Text[] texts;
// 各ボタンが現在どの文字を表示しているかを管理する配列
public int[] nows;
public void ChangeText(int n)
{
// 次の文字へ変更
nows[n] += 1;
// 文字数を超えたら0に戻す(ループ)
if (nows[n] >= chars.Length)
{
nows[n] = 0;
}
// ボタンのテキストを更新
texts[n].text = chars[nows[n]].ToString();
}
}
スクリプトのポイント
charsに表示可能な文字(今回は「あいうえお」)を設定textsに 4つのボタンのTextコンポーネント を登録nows配列で 各ボタンの現在のインデックスを管理ChangeText(int n)で ボタンを押すたびに次の文字に変更- 文字の上限を超えたら最初の文字に戻る(ループ処理)
5-2. 設定方法(Inspector)
① StringPassword スクリプトをアタッチ
- パスワード入力用の
PanelにStringPasswordスクリプトをアタッチ Inspectorで以下の設定を行う
② texts 配列にボタンの Text を設定
textsのサイズを4に設定- それぞれのスロットに 各ボタンの
Textコンポーネント をドラッグ&ドロップで登録
③ nows 配列を設定
nowsのサイズを4に設定- 各値を
0に設定(初期状態)

④ 各ボタンの OnClick() に ChangeText(int n) を設定
- 各ボタンの
Inspectorを開く OnClick()にStringPasswordのChangeText()を設定- 引数(
int n)には、それぞれ0, 1, 2, 3を設定
(例:1番目のボタンはChangeText(0)、2番目はChangeText(1))




👉 これで、各ボタンを押すと数字が切り替わるようになります!
動作確認
- ボタンを押すと「0→1→2→…→9→0」のようにループして変化する
- 4つのボタンがそれぞれ独立して動作する

これで、パスワードを入力するギミックの基本が完成しました!
次は、入力した文字が正解か判定する処理 を作成していきます。
6. 正解のパスワードを設定
脱出ゲームには「鍵」だけでなく、「パスワード入力」も定番のギミックです。
このセクションでは、4桁のパスワードを入力し、正解するとドアが開くように設定していきます。
6-1. 正解を判定するコード
まず、StringPassword スクリプトに「入力されたパスワードをチェックする機能」を追加します。
以下のコードを StringPassword に追記してください。
public string Answer;
public void CheckAnswer()
{
string answer = "";
foreach (Text text in texts)
{
answer += text.text;
}
if (answer == Answer)
{
Debug.Log("正解");
}
}
コードの解説
Answer(正解のパスワード)をpublic stringで用意CheckAnswer()で 全てのボタンの現在の文字を取得- 取得した文字列と
Answerを比較- 一致すれば「正解」と判定
- 一致しなければ何も起こらない
6-2. 設定方法
- Inspector で正解のパスワードを設定
StringPasswordのAnswerに「1234」や「ABCD」など、好きな4桁の答えを設定
- ボタンを押すたびに答えをチェック
- すべてのボタンの
OnClick()にCheckAnswer()を設定する
- すべてのボタンの

動作確認
- ゲームを実行
- 4つのボタンをクリックして文字を変更
- 正解の文字列にすると
Consoleに「正解」が表示される
7. クリア処理を追加しよう(応用)
現在のコードでは、正解すると Debug.Log("正解"); が表示されるだけです。
ここに 「ドアが開く」 処理を追加してみましょう。
スクリプトに以下を追加
public UnityEvent OnCorrect;
public void CheckAnswer()
{
string answer = "";
foreach (Text text in texts)
{
answer += text.text;
}
if (answer == Answer)
{
Debug.Log("正解");
OnCorrect.Invoke();
}
}
設定方法
StringPasswordのInspectorでOnCorrectにDoor (Open)のOpenObject()を設定- これで 正解のパスワードを入力すると、ドアが開く!
8. まとめ
今回の記事では、Unityで2D脱出ゲームにドアの開閉、鍵を使ったロック解除、4桁のパスワードロックを実装する方法を解説しました。
🔹 クリックでドアを開ける処理Door と Door (Open) を用意し、クリックすると Door (Open) をアクティブにすることで、シンプルな開閉システムを作成しました。
🔹 鍵を使用してドアを開ける処理BlockObject スクリプトを作成し、ItemBox と連携させることで、「鍵を持っているときだけドアを開ける」というロック解除の仕組みを作りました。
🔹 4桁のパスワードロックの実装
ボタンを押すとテキストが切り替わり、正しいパスワードを入力するとクリアできる仕組みを StringPassword スクリプトで実装しました。

これで、「アイテムを取得 → ドアを開ける → パスワードを解除する」 という、脱出ゲームに欠かせない基本的な要素を作ることができました。
あわせて読みたい
- 🔑 脱出ゲーム制作に最適!Unityアセットストアのおすすめ鍵素材
脱出ゲームに欠かせない「鍵」の演出をワンランクアップ!使いやすいアセットを紹介。 - 🚪 【Unity】脱出ゲームにおすすめのドアアセット!高品質&アニメーション付き素材
パスワード付きドアや開閉ギミックに最適なアセットを紹介。 - 🧰 【Unity 2D】脱出ゲームの作り方② アイテムボックス&アイテム取得の実装
前回の記事。アイテム取得やUIの設定について詳しく解説しています。 - 🛋️ 【初心者向け】Unity脱出ゲーム制作に使えるインテリアアセットまとめ
部屋の雰囲気作りに欠かせない家具や装飾アセットをまとめました。 - 🧪 Unityでパスワードを使ったドアを作成!初心者向けステップバイステップ解説
パスワード入力でドアが開く仕組みを、ステップごとに丁寧に解説!
よくある質問(FAQ)
- Qパスワードを数字のみにしたい
- A
charsを"0123456789"に設定すると数字だけになります。
- Q鍵がなくてもドアが開く
- A
BlockObjectのOnthis()でCanUseItem()の判定が正しく動いているか確認してください。
- Qクリックでドアが開かない
- A
Door (Open)のInspectorでActiveがfalseになっているか確認してください。









※当サイトはアフィリエイト広告を利用しています。リンクを経由して商品を購入された場合、当サイトに報酬が発生することがあります。
※本記事に記載しているAmazon商品情報(価格、在庫状況、割引、配送条件など)は、執筆時点のAmazon.co.jp上の情報に基づいています。
最新の価格・在庫・配送条件などの詳細は、Amazonの商品ページをご確認ください。