【Unity6】2D脱出ゲームの作り方|ドアの開け閉めを共通スクリプトで制御する方法

【Unity6】2D脱出ゲームの作り方|ドアの開け閉めを共通スクリプトで制御する方法 ゲームの作り方

🔍 Unity6 を使った「1シーン完結型・2D脱出ゲーム制作講座」です。

この記事では、ロック付きドアの挙動を1つの共通スクリプトで管理する方法を解説します。

ロック解除の前後で「ギミック拡大」「ドアの開閉」といった動作を切り替えられるようになります。

実装するドアの挙動

本記事では、以下のようなドア挙動を実装します。

🔒 ロック解除前

  • ドアをクリックすると
    ギミック用の拡大背景を表示

🔓 ロック解除後

  • ドアをクリックすると
    ドアが開く / 閉じる

この切り替えを 共通スクリプト1本で制御します。

用意するオブジェクト構成

Stage
 ├─ DustBox(ごみ箱全体の背景)
 |  ├─ Door1
 |  |  ├─ CloseImage
 |  |  └─ OpenImage
 |  ├─ Door2
 |  |  ├─ CloseImage
 |  |  └─ OpenImage
 |  └─ Door3
 |     ├─ CloseImage
 |     └─ OpenImage

用意する画像

【Unity6】2D脱出ゲームの作り方|扉なしのごみ箱全体の画像

背景画像(扉なし)

【Unity6】2D脱出ゲームの作り方|右の扉(閉じた画像)

閉じた扉(それぞれの扉ごと)

【Unity6】2D脱出ゲームの作り方|右の扉(開いた画像)

開いた扉(それぞれの扉ごと)

BackgroundType に「None」を追加する

ロック中に拡大表示する背景を管理するため、
BackgroundTypeNone を追加しておきます。

public enum BackgroundType
{
 // 他の背景ID
 None
}

※ ロック中に拡大表示しないドアにも対応できるようにするためです。

DoorBase.cs(共通ドア制御スクリプト)

using UnityEngine;

public class DoorBase : MonoBehaviour
{
[SerializeField] private GameObject closedImage;
[SerializeField] private GameObject openImage;

public BackgroundType lockedBackgroundID = BackgroundType.None;

protected bool isUnlocked = false;
protected bool isOpen = false;

public virtual void Unlock()
{
isUnlocked = true;
}

// ドアクリック時の処理
public virtual void OnClick()
{
if (!isUnlocked)
{
// ロック中 → ギミック拡大
if (lockedBackgroundID != BackgroundType.None)
{
BackgroundManager.Instance.ZoomTo(lockedBackgroundID);
}
return;
}

ToggleDoor();
}

// ドア開閉切り替え
protected virtual void ToggleDoor()
{
SEManager.Instance.PlayOpenSE();
isOpen = !isOpen;
if (closedImage != null) closedImage.SetActive(!isOpen);
if (openImage != null) openImage.SetActive(isOpen);
}

public void OpenDoor()
{
if (!isUnlocked) return;

SEManager.Instance.PlayOpenSE();
isOpen = true;
closedImage.SetActive(false);
openImage.SetActive(true);
}

//背景切り替え時に閉じる
public virtual void ResetObject()
{
isOpen = false;
if (closedImage != null) closedImage.SetActive(true);
if (openImage != null) openImage.SetActive(false);
}

//初期化用
public virtual void ReStart()
{
isUnlocked = false;
}
}

スクリプトのポイント解説

✔ 共通化のメリット

  • ドアごとにスクリプトを作らなくてOK
  • Unlock() を呼ぶだけでロック解除できる
  • ギミック側から簡単に制御可能
    → 特殊なドアは継承してカスタマイズ可能

✔ 拡張しやすい設計

  • virtual を使用しているため

インスペクターの設定方法

  1. ドアの親オブジェクト(Door1など)にDoorBase スクリプトをアタッチ
  2. ClosedImage に閉じた扉画像
  3. OpenImage に開いた扉画像
  4. LockedBackgroundIDロック中に表示する拡大背景を設定
  5. Button コンポーネントを追加し、このスクリプトのOnClick() を登録

まとめ

今回は、ロック状態に応じてドアの挙動を切り替える共通スクリプトを作成しました。

  • ロック中 → ギミック拡大
  • ロック解除後 → ドアの開閉

この DoorBase スクリプトを使えば、
複数のドアを簡単に管理できます。

👉 次回は、ドアのロックを解除するギミックを作成し、
DoorBase と連動させる方法
を解説します。

コメント

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