Unityゲームの作り方メモ脱出ゲーム

【Unity 2D】脱出ゲームの作り方③ ドア開閉&鍵&パスワードロックを実装

Unity

1. はじめに

こんにちは!今回もUnityで2D脱出ゲームを作っていきます。
前回までに部屋の移動アイテムボックスの作成アイテムを取得する仕組みを実装しましたね。

今回は「ドアの開閉」と「鍵やパスワードを使ったロック解除」を実装して、脱出ゲームらしいギミックを作っていきます!

今回実装する機能

クリックでドアを開閉
鍵を持っているとドアが開く
パスワードを入力してロック解除

脱出ゲームでは「ただ部屋を移動するだけ」ではなく、鍵やパズルを解いて進む要素が大切です。
これらの仕組みを取り入れることで、より本格的な脱出ゲームに仕上げていきましょう!

それでは、まずは「ドアの作成」から始めます!




2. ドアを作成しよう

脱出ゲームでは、ドアを開けることがゴールの一つになります。そこで今回は、クリックすると開閉するドア を作成します。

ドアの作成手順は以下のようになります。

  1. 閉じたドアの作成
  2. 開いたドアの作成
  3. クリックで開閉できるようにする

2-1. 閉じたドアを作成する

まず、閉じた状態のドアを作成しましょう。

  1. room1 の中に Image を作成します。
  2. 名前を Door に変更します。
  3. InspectorSource Image閉じたドアの画像 を設定します。
  4. Add Component から Button コンポーネントを追加します。

👉 この設定で、ドアをクリックできるようになりました!


2-2. 開いたドアを作成する

次に、ドアを開いた状態の画像も作成します。

  1. DoorCtrl+D で複製します。
  2. 複製したオブジェクトの名前を Door (Open) に変更します。
  3. InspectorSource Image開いたドアの画像 に変更します。
  4. Door (Open)非アクティブ(非表示) にしておきます。
    • InspectorDoor (Open)チェックを外すSetActive(false) の状態にする)。

👉 これで、開いた状態のドアを用意できました!


2-3. クリックでドアを開閉する

作成した Door (Open) をクリックすると表示され、Door は非表示になるように設定します。

① スクリプトの作成

  1. C#スクリプト を新規作成します。
  2. 名前を Object にします。
  3. 作成したスクリプトを Door (Open) にアタッチします。
  4. スクリプトを開き、以下のコードを入力します。
using UnityEngine;

public class Object : MonoBehaviour
{
public void OpenObject()
{
this.gameObject.SetActive(true);
}

public void CloseObject()
{
this.gameObject.SetActive(false);
}
}

② ボタンにスクリプトを設定

  1. DoorButtonコンポーネントOnClick()Door (Open)OpenObject() を設定。
  2. Door (Open)ButtonコンポーネントOnClick()CloseObject() を設定。

👉 これでクリックするとドアが開閉するようになります!


動作確認

ここまでの手順が完了したら、実際にプレイして動作を確認しましょう!

  • Door をクリックすると Door (Open) が表示されるか?
  • Door (Open) をクリックすると Door に戻るか?

うまくいかない場合は、以下をチェックしてください。 ✅ Door (Open)SetActivefalse になっているか?
OnClick() に正しい関数が設定されているか?


2-4. まとめ

  • Door(閉じたドア)を作成し、ボタン機能を追加
  • Door (Open)(開いたドア)を作成し、非表示に設定
  • スクリプトを作成し、クリックで開閉できるようにした

次のステップでは、鍵を使ってドアを開ける仕組みを作ります! 🔑




3. 鍵を使ってドアを開ける

脱出ゲームでは、「鍵を持っていないと開かないドア」を作るのが定番です。
今回は、プレイヤーが鍵を持っている場合のみドアを開けられる仕組みを実装します。


3-1. スクリプトを作成

まず、鍵を所持しているかを判定し、鍵を使ってドアを開くスクリプトを作成します。

BlockObject スクリプトの作成

  1. プロジェクトウィンドウ を右クリック → CreateC# Script を選択
  2. 名前を BlockObject に変更
  3. 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 にスクリプトをアタッチ

  1. HierarchyウィンドウDoor を選択
  2. InspectorAdd Component をクリック
  3. BlockObject を検索し、追加

② 使用するアイテムを設定

  1. BlockObject コンポーネントの TypeKey に設定
    InspectorType ドロップダウンリストで Key を選択

③ 鍵を使ったときの動作を設定

  1. BlockObjectClearIventDoor (Open)OpenObject() を設定
    設定手順:
    • InspectorClearIvent+ ボタン をクリック
    • Door (Open)Hierarchy からドラッグして設定
    • No Function をクリックし Object > OpenObject() を選択



3-3. ボタンの設定

次に、鍵を持っている時だけドアを開けるようにボタンを設定します。

Door のボタンに Onthis() を設定

  1. DoorInspectorButton コンポーネントを開く
  2. OnClick()+ ボタンをクリック
  3. DoorHierarchy からドラッグ
  4. No Function をクリックし BlockObject > Onthis() を選択

👉 これで、プレイヤーが鍵を持っている時だけドアが開くようになります!


3-4. 動作確認

✅ 鍵を持っている場合

  1. をクリックすると ItemBox に鍵が追加される
  2. Door をクリックすると、 Door (Open) に切り替わる(ドアが開く!)

❌ 鍵を持っていない場合

  1. Door をクリックしても何も起こらない

🔍 ConsoleDebug.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 スクリプトで「アイテムがある場合のみ使用できる」処理を実装
  • ClearIventDoor (Open)OpenObject() を設定
  • OnClick()BlockObject.Onthis() を設定し、鍵がないと開かないドアを作成

これで、「鍵がないと開かないドア」 の仕組みが完成しました! 🎉

次は、4桁のパスワードロックを実装 して、より本格的なギミックを作りましょう!




4. 4桁のパスワードギミックを作成

脱出ゲームには、鍵だけでなくパスワードを入力してドアを開ける仕組みもよく使われます。ここでは 「4桁のパスワードを入力し、正解ならドアが開く」 というギミックを作成します。


4-1. UIでパスワード入力画面を作成

まず、パスワード入力画面のUIを作成していきましょう。

① パスワード入力画面のPanelを作成

  1. Canvas の中に Panel を作成 し、名前を PasswordPanel に変更
  2. InspectorRect Transform でサイズを調整(例:Width: 800, Height: 400
  3. PanelImage コンポーネントを 半透明(例:Alpha値 150) にして、パスワード画面らしくする

② パスワードのボタン配置

  1. PasswordPanel の子オブジェクトとして Image を作成(名前は PasswordGrid にする)
  2. InspectorRect Transform のサイズを調整
  3. Add Component から Grid Layout Group を追加
    • Cell Size(ボタンの大きさ): Width: 200, Height: 200
    • Spacing(ボタンの間隔): X: 10, Y: 10
    • Child AlignmentMiddle Center
  4. PasswordGrid の子オブジェクトとして Button を4つ作成
    • Button の名前は PasswordButton0, PasswordButton1, PasswordButton2, PasswordButton3 に変更
    • 各ボタンに Text を設定し、初期状態では "0" にしておく

③ パスワード入力画面を閉じるボタンを作成

  1. PasswordPanel の子オブジェクトとして Button を作成(名前を ClosePasswordPanel に変更)
    • Text"閉じる" に変更
    • PasswordPanel は最初 非アクティブ にしておく(InspectorActivefalse に)

4-2. スクリプトを作成

次に、パスワード画面の開閉処理をスクリプトで実装します。

  1. Panelに前に作成したObjectスクリプトをアタッチします。

OnClick() の設定

  1. ClosePasswordPanelOnClick()PasswordPanelCloseObject() を設定

次は 「ボタンを押すと数字が変わる仕組み」 を作成していきます。これにより、プレイヤーがボタンを押すことでパスワードを入力できるようになります!




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();
    }
}

スクリプトのポイント

  1. chars に表示可能な文字(今回は「あいうえお」)を設定
  2. texts4つのボタンのTextコンポーネント を登録
  3. nows 配列で 各ボタンの現在のインデックスを管理
  4. ChangeText(int n)ボタンを押すたびに次の文字に変更
  5. 文字の上限を超えたら最初の文字に戻る(ループ処理)



5-2. 設定方法(Inspector)

StringPassword スクリプトをアタッチ

  1. パスワード入力用の PanelStringPassword スクリプトをアタッチ
  2. Inspector で以下の設定を行う

texts 配列にボタンの Text を設定

  1. texts のサイズを 4 に設定
  2. それぞれのスロットに 各ボタンの Text コンポーネント をドラッグ&ドロップで登録

nows 配列を設定

  1. nows のサイズを 4 に設定
  2. 各値を 0 に設定(初期状態)

④ 各ボタンの OnClick()ChangeText(int n) を設定

  1. 各ボタンの Inspector を開く
  2. OnClick()StringPasswordChangeText() を設定
  3. 引数(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. 設定方法

  1. Inspector で正解のパスワードを設定
    • StringPasswordAnswer に「1234」や「ABCD」など、好きな4桁の答えを設定
  2. ボタンを押すたびに答えをチェック
    • すべてのボタンの OnClick()CheckAnswer() を設定する

動作確認

  1. ゲームを実行
  2. 4つのボタンをクリックして文字を変更
  3. 正解の文字列にすると 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();
}
}

設定方法

  1. StringPasswordInspectorOnCorrectDoor (Open)OpenObject() を設定
  2. これで 正解のパスワードを入力すると、ドアが開く!



8. まとめ

今回の記事では、Unityで2D脱出ゲームにドアの開閉鍵を使ったロック解除4桁のパスワードロックを実装する方法を解説しました。

🔹 クリックでドアを開ける処理
DoorDoor (Open) を用意し、クリックすると Door (Open) をアクティブにすることで、シンプルな開閉システムを作成しました。

🔹 鍵を使用してドアを開ける処理
BlockObject スクリプトを作成し、ItemBox と連携させることで、「鍵を持っているときだけドアを開ける」というロック解除の仕組みを作りました。

🔹 4桁のパスワードロックの実装
ボタンを押すとテキストが切り替わり、正しいパスワードを入力するとクリアできる仕組みを StringPassword スクリプトで実装しました。

これで、「アイテムを取得 → ドアを開ける → パスワードを解除する」 という、脱出ゲームに欠かせない基本的な要素を作ることができました。




よくある質問(FAQ)

Q
パスワードを数字のみにしたい
A

chars"0123456789" に設定すると数字だけになります。

Q
鍵がなくてもドアが開く
A

BlockObjectOnthis()CanUseItem() の判定が正しく動いているか確認してください。

Q
クリックでドアが開かない
A

Door (Open)InspectorActivefalse になっているか確認してください。

タイトルとURLをコピーしました