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

Unity3D脱出ゲームの作り方⑤|ドアをクリックで開く&アイテム選択機能

Unity

1. はじめに

Unityで脱出ゲームを作るときに欠かせない要素のひとつが「ドアの開閉」と「アイテムを使ったギミック」です。例えば、プレイヤーがドアをクリックすると開く仕組みや、特定のアイテム(鍵など)を持っているときだけドアが開くシステムを実装することで、よりリアルなゲーム体験を提供できます。

この記事では、クリックでドアを開く方法と、アイテムスロットを活用して鍵を使った開閉システムを作成する手順を詳しく解説します。具体的には、以下の流れで進めていきます。

ドアの開閉アニメーションを作成
スクリプトでドアをクリックすると開く機能を追加
アイテムスロットの選択機能を実装
鍵を持っている場合のみドアが開くように設定

これらの機能を実装することで、プレイヤーがアイテムを使ってドアを開く、脱出ゲームらしい仕組みを作ることができます!初心者向けに分かりやすく解説していくので、一緒に進めていきましょう!




2. ドアの開閉アニメーションを作成

脱出ゲームでは、ドアをクリックしたら開くという動作が必要になります。そこで、まずはドアが開くアニメーションを作成していきましょう。UnityのAnimationウィンドウを使うことで、スクリプトを使わずに簡単にアニメーションを作成できます。


2.1 アニメーションのウィンドウを開く

まず、UnityのAnimationウィンドウを開きます。

  1. ヒエラルキー(Hierarchy)ウィンドウでドアのオブジェクトを選択
  2. 上部メニューの Window → Animation → Animation をクリック
  3. すると、Animationウィンドウが開きます

このウィンドウでは、オブジェクトの動きや回転、スケールなどを記録し、アニメーションを作成することができます。


2.2 ドアの待機アニメーション(DoorIdle)を作成

まずは、ドアが何もしていない状態(待機状態)のアニメーションを作成します。

  1. Animationウィンドウの「Create」ボタンをクリック
  2. DoorIdle.anim という名前で .anim ファイルを作成
  3. 赤い丸の録画ボタン(Recordボタン)をクリック
  4. インスペクター(Inspector)ウィンドウでドアの Transform を少し変更(例:位置を少し動かして戻す)
  5. 0秒のキーフレームが自動で作成される
  6. 赤い録画ボタンを再度クリックして停止

これで、「待機状態のアニメーション」が作成されました。


2.3 ドアが開くアニメーション(DoorOpen)を作成

次に、ドアが開く動きを作成します。

  1. Animationウィンドウの「Create New Clip」ボタンをクリック
  2. DoorOpen.anim という名前で .anim ファイルを作成
  3. 赤い丸の録画ボタンをクリック
  4. 0秒地点のキーフレームを作成
    • Transform → Rotation.Y0 に設定(ドアが閉じた状態)
  5. 1秒地点のキーフレームを作成
    • Transform → Rotation.Y75 に変更(ドアが開いた状態)
  6. 赤い録画ボタンを再度クリックして停止
  7. 再生ボタンを押して動作を確認
    • 0秒から1秒にかけてドアがスムーズに開くかチェック!

💡 ポイント

  • Loop Time のチェックを外す(InspectorウィンドウのAnimator設定)
    • これをしないとドアが何度も自動で開いてしまうので注意!

2.4 アニメーションを設定

作成したアニメーションをAnimatorに設定しましょう。

  1. ドアのオブジェクトを選択
  2. インスペクター(Inspector)ウィンドウで「Add Component」→「Animator」を追加
  3. 「Animator Controller」フィールドに新しい DoorAnimator を作成
  4. 作成した DoorIdleDoorOpen のアニメーションを設定
    • DoorIdle をデフォルト状態にする
    • DoorOpen はスクリプトで再生するので Transition(遷移) は作成しない

これで、ドアのアニメーション作成は完了です!🎉
次のステップでは、スクリプトを使ってクリックでドアを開く処理を作成していきます。




3. ドアをクリックで開くスクリプトを作成

さて、ドアのアニメーションができたら、次は実際に クリックでドアを開くスクリプト を作っていきます!
アニメーション単体ではドアは勝手に動かないので、スクリプトで操作できるようにしましょう。


3.1 Doorスクリプトを作成

まずは、ドアをクリックするとアニメーションを再生する スクリプト (Door.cs) を作成します。

  1. プロジェクトウィンドウを開く
  2. Assets フォルダ内で 右クリック
  3. CreateC# Script を選択
  4. 名前を Door にする

作成した Door.cs をダブルクリックして開き、次のコードを入力してください。

Door.cs

using UnityEngine;

public class Door : MonoBehaviour
{
    [SerializeField] Animator animator = default;

    public void Open() 
    {
        animator.Play("DoorOpen");
    }
}

3.2 スクリプトをドアにアタッチ

作成した Door スクリプトをドアに適用していきます。

  1. ヒエラルキーでドアのオブジェクトを選択
  2. Inspector を開き、Door.csドラッグ&ドロップ して追加
  3. Door コンポーネント内の AnimatorドアのAnimator をドラッグ&ドロップで設定

3.3 ドアのクリックイベントを設定

次に、ドアをクリックすると Open() が実行されるようにします。

  1. ドアのオブジェクトを選択
  2. InspectorウィンドウAdd Component をクリック
  3. Event Trigger を検索し追加
  4. Add New Event Type をクリックし、Pointer Click を選択
  5. + ボタンを押して、新しいアクションを追加
  6. ドアのオブジェクトを ドラッグ&ドロップ して設定
  7. No Function をクリックし、Door → Open() を選択

3.4 BoxColliderを設定

クリックを判定するために、ドアに BoxCollider を追加します。

  1. ドアのオブジェクトを選択
  2. InspectorウィンドウAdd Component
  3. Box Collider を検索し追加
  4. サイズや位置を調整して、ドアの範囲をカバーするように設定

3.5 テストプレイ

ここまでできたら、実際に動作を確認しましょう!

  1. ゲームを再生
  2. ドアをクリック
  3. ドアがアニメーションとともに開けば成功!

これで、クリックでドアを開ける仕組みが完成しました!
次のステップでは、アイテム(鍵)を使って開ける仕組み を作っていきます。



4. アイテムスロットの選択機能を実装

脱出ゲームでは、プレイヤーがアイテムを取得し、必要なタイミングで使用する仕組みが重要です。例えば、鍵を拾ったらスロットに追加し、ドアを開けるときにその鍵を選択して使用するという流れですね。

この記事では、アイテムスロットを作成し、選択時に枠を表示する機能を実装します。これにより、プレイヤーが今どのアイテムを選択しているのかを明確にすることができます。


4.1 Slotスクリプトの作成・編集

まずは、アイテムのスロットを作成し、選択時に枠を表示する機能を追加しましょう。

① Slotスクリプトを編集

プロジェクトウィンドウを右クリックして「Create」→「C# Script」を選び、新しいスクリプトを作成します。名前は 「Slot」 にしましょう。(前の記事で作成済み)

作成したら、以下のコードを入力してください。

using UnityEngine;
using UnityEngine.UI;

public class Slot : MonoBehaviour
{
    [SerializeField] GameObject backPanel = default; // 選択枠
    [SerializeField] Image image = default; // アイテム画像
    Item item = null; // アイテム情報

    private void Start()
    {
        // 初期状態では枠を非表示
        backPanel.SetActive(false);
    }

    // アイテムをスロットにセット
    public void Set(Item item) 
    {
        this.item = item;
        image.sprite = item.sprite; // アイテムの画像を設定
    }

    // アイテムをスロットから削除
    public void RemoveItem() 
    {
        item = null;
        image.sprite = null;      
        HideBackPanel(); // 枠も非表示にする
    }

    // アイテム情報を取得
    public Item GetItem() 
    {
        return item;
    }

    // スロットが空かどうか判定
    public bool IsEmpty() 
    {
        return item == null;
    }

    // アイテムを選択したときに枠を表示
    public void OnSelect()
    {
        backPanel.SetActive(true);      
    }

    // 選択を解除(枠を非表示)
    public void HideBackPanel()
    {
        backPanel.SetActive(false);
    }
}

② Slotスクリプトを設定

  1. Slot をスロットのPrefabにアタッチします。(前の記事でアタッチ済み)
  2. InspectorBackPanel を設定するフィールドが追加されるので、スロットの Back オブジェクトをドラッグ&ドロップして設定します。
  3. Image のフィールドには、スロット内のアイテム画像を表示するUIの Image を設定してください。(前の記事で設定済み)

4.2 ItemBoxスクリプトの作成・編集

次に、アイテムスロットを管理する ItemBox スクリプトを作成し、プレイヤーがアイテムを取得・選択できるようにします。

① ItemBoxスクリプトを編集

プロジェクトウィンドウを右クリックして「Create」→「C# Script」を選び、新しいスクリプトを作成します。名前は 「ItemBox」 にしましょう。(前の記事で作成済み)

以下のコードを入力してください。

using UnityEngine;

public class ItemBox : MonoBehaviour
{
    [SerializeField] Slot[] slots = default; // すべてのスロットを取得
    public static ItemBox instance; // 他のスクリプトからアクセスできるようにする
    Slot selectSlot; // 選択中のスロット

    private void Awake()
    {
        instance = this; // シングルトンパターンを適用
    }

    // アイテムをスロットに追加
    public void SetItem(Item item)
    {
        for (int i = 0; i < slots.Length; i++)
        {
            Slot slot = slots[i];
            if (slot.IsEmpty()) // 空のスロットを探す
            {
                slot.Set(item);
                break;
            }
        }
    }

    // スロットをクリックしたら選択状態にする
    public void OnSlotClick(int position)
    {
        if (slots[position].IsEmpty()) return; // 空のスロットなら何もしない

        // すべてのスロットの選択枠を非表示にする
        for (int i = 0; i < slots.Length; i++)
        {
            slots[i].HideBackPanel();
        }

        // クリックしたスロットの枠を表示
        slots[position].OnSelect();
        selectSlot = slots[position]; // 選択状態として保存
    }

    // 選択中のアイテムが特定のタイプかどうか判定
    public bool CheckSelectItem(Item.Type useItemType)
    {
        if (selectSlot == null) return false;
        return selectSlot.GetItem().type == useItemType;
    }

    // 選択中のアイテムを使用して削除
    public void UseSelectItem()
    {
        selectSlot.RemoveItem();
        selectSlot = null;
    }
}

② ItemBoxスクリプトを設定

  1. ItemBox スクリプトを ItemBoxCanvas にアタッチします。
  2. InspectorSlots の配列フィールドが追加されるので、すべてのスロット(Slotオブジェクト)をドラッグ&ドロップして設定してください。

4.3 スロットのボタン設定

最後に、スロットをクリックすると OnSlotClick() が実行されるように設定します。

  1. Slot のPrefabを開く
  2. Add ComponentButton を追加
  3. On Click() の設定を開く
  4. Prefabを保存して閉じる
  5. ヒエラルキーのスロットを選択
  6. ItemBoxCanvas をドラッグ&ドロップ
  7. ItemBox.OnSlotClick(int) を設定
  8. 数字入力欄にスロットの番号(0, 1, 2, 3, 4)を順番に入力

これで、スロットをクリックすると選択枠が表示され、現在選択しているアイテムを明確にできるようになりました!


テストプレイ

ここまで設定が終わったら、テストプレイをしてみましょう!

スロットをクリックすると枠が表示されるか?
アイテムを取得するとスロットに追加されるか?
スロットが空のとき、枠が表示されないか?

これらが問題なく動作していれば成功です!


次のステップでは、このアイテム選択機能を活用して、「鍵を持っているときだけドアを開ける」機能を追加していきます!



5. 鍵を使ったドアの開閉機能を追加

さて、ここからは 鍵を使ったドアの開閉機能 を追加していきます!
これまでは ドアをクリックすると開く だけのシンプルな仕組みでしたが、今回は 鍵を持っているときだけ開くように制御 します。
これで、脱出ゲームらしい「鍵を探してドアを開ける」仕組みが完成します!


5.1 Door スクリプトを編集

まず、ドアの開閉処理に アイテムスロットの選択機能を組み込む ために、Door.cs を編集していきます。

🔹 やりたいこと

  • 鍵(Key)を選択しているときだけ ドアが開く
  • 鍵を使用するとアイテムボックスから削除される

では、スクリプトを編集しましょう!

Door.cs を編集

以下のコードを入力してください。

using UnityEngine;

public class Door : MonoBehaviour
{
    [SerializeField] Animator animator = default;
    
    public void Open()
    {
        // 選択中のアイテムが "鍵" であるか確認
        if (ItemBox.instance.CheckSelectItem(Item.Type.key))
        {
            // 鍵を使用してスロットから削除
            ItemBox.instance.UseSelectItem();
            // ドアの開閉アニメーションを再生
            animator.Play("DoorOpen");
        }
    }
}

🎯 ポイント解説

  1. ItemBox.instance.CheckSelectItem(Item.Type.key)鍵が選択されているかをチェック
  2. 鍵が選択されていた場合
    • ItemBox.instance.UseSelectItem(); で鍵を削除
    • animator.Play("DoorOpen"); でドアを開く

これで、鍵を持っていないと ドアが開かない仕組み ができました!


5.2 ゲームを実行して動作チェック

すべての設定が完了したら、いよいよ テストプレイ!

動作チェックリスト

  • 鍵を拾うとスロットに表示されるか?
  • スロットをクリックすると鍵が選択されるか?
  • 鍵を選択した状態でドアをクリックすると開くか?
  • 鍵を使用するとスロットから削除されるか?
  • 鍵がない状態ではドアが開かないか?

脱出ゲームをもっと簡単に「Escape Development Kit」

ドアの開閉やアイテム管理など、脱出ゲームのシステムを一から作るのは大変ですよね?
そんな時に便利なのが 「Escape Development Kit」 です!✨

👉 Escape Development Kit – Asset Store

ドアの開閉、アイテム管理、ギミック実装がすぐに使える!
プログラミング不要!ドラッグ&ドロップで簡単カスタマイズ
制作時間を大幅に短縮!本格的な脱出ゲームが素早く完成!

すぐに脱出ゲームを作りたい!」という人にピッタリのアセットです!
今すぐチェック👇

👉 Escape Development Kit – Asset Store


まとめ

これで、鍵を使ってドアを開けるシステムが完成しました!✨

🔹 今回やったこと

  • Door.cs を編集して 鍵を持っているときだけ開く仕組み を作成
  • Slotアイテム選択機能を追加
  • ItemBox を活用して 鍵の有無をチェック&削除

これで、脱出ゲームらしい 「鍵を探して開ける」 という要素がしっかり組み込まれました!

次回は さらにゲームを面白くするための仕組み を追加していきます!💡




よくある質問(FAQ)

Q
ドアのアニメーションが再生されません。どうすればいいですか?
A

AnimatorLoop Time をオフにし、animator.Play("DoorOpen") の綴りが正しいか確認してください。

Q
アイテムがスロットにセットされません。どうしたらいいですか?
A

ItemBox.instance.SetItem(item);itemnull になっていないかデバッグログで確認してください。

Q
鍵を持っているのにドアが開きません。原因は何ですか?
A

Item.Type.keykeyItem クラス内で定義されているものと一致しているか確認してください。

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