【Unity6】2D脱出ゲームの作り方⑮|ゲームデータをリセットしてタイトルに戻る②

初期化時にスポーン管理が必要なアイテム ゲームの作り方
初期化時にスポーン管理が必要なアイテム

✅前回の記事はこちら👇

🎮 Unity6で進める
「1つのシーンで完結する2D脱出ゲーム講座」第15回(最終回)です!

前回の記事では👇

  • タイトルに戻るボタンの実装
  • アイテムボックスの初期化
  • BGM・画面のフェードアウト処理

を解説しました。

今回はその続きとして、

  • インターフェースを使ってギミックを一括リセットする方法
  • ゲーム開始時の状態にアイテムを再配置する方法

を解説します。

各ギミックを一括でリセットする方法

本講座⑤回目の記事で作成した
オブジェクト初期化用インターフェースを使用します。

記事はこちらから👇
⑤|オブジェクトをリセットするインターフェース

IResettable の ReStart() を一括で呼び出す

タイトルに戻る際、
シーン内に存在するすべてのギミックを初期化します。

OptionManager.cs を修正

ReStartGame() メソッドに以下を追記します。

var allBehaviours = Resources.FindObjectsOfTypeAll<MonoBehaviour>();

foreach (var behaviour in allBehaviours)
{
if (behaviour is IResettable resettable &&behaviour.gameObject.scene.isLoaded)
{
resettable.ReStart();
}
}

ポイント解説

  • IResettable を実装しているクラスだけを対象にする
  • 現在ロードされているシーンのオブジェクトのみをリセット
  • 新しいギミックを追加しても
    👉 IResettable を付けるだけで自動対応できる

各ギミックに IResettable を追加する

① StickRetrieve.cs(木の棒でハンドルを取るギミック)

クラス宣言に IResettable を追加します。

public class StickRetrieve : MonoBehaviour, IResettable

初期化処理を追加👇

public void ResetObject()
{
 // 背景切り替え時は何もしない
}

public void ReStart()  // ゲームリセット時
{
isCompleted =false;

faucetHandle_Back.SetActive(true);
faucetHandle_Front.SetActive(false);

foreach (var image in stickAnimationImages)
{
  image.SetActive(false);
}
}

👉 ゲーム開始時の状態に完全に戻すのが目的です。

② FaucetController.cs(水道ギミック)

public class FaucetController : MonoBehaviour, IResettable

背景切り替え時👇

public void ResetObject()
{
SEManager.Instance.WaterStop(); //流水音を止める
}

ゲームリセット時👇

public void ReStart()
{
isHandleInstalled = false;
handleSet.SetActive(false);
water.SetActive(false);
}

アイテムを「初期配置」に戻すための準備

蛇口ハンドルのように、
ゲーム開始時には存在しないアイテムを管理するため、
ItemData にフラグを追加します。

ItemData.cs にフィールド追加

public bool UseSpawnSystem =false;// スポーン管理対象
public bool IsSpawned = false; // 出現済みか
public bool IsPicked = false; // 取得済みか

  • デフォルトはすべて false
  • スポーン管理が必要なアイテムのみ
    UseSpawnSystem にチェックを入れます
【Unity6】2D脱出ゲームの作り方⑮|スポーン対象にしてないため、出現前に表示されてしまった蛇口ハンドル

👆スポーン対象にしないと、出現前のアイテムが表示されてしまいます。

📌 ScriptableObject解説記事はこちら👇
⑥|アイテムスロットの作成とデータベース管理

StickRetrieve.cs を修正(ハンドル管理)

フィールド追加

public ItemData handleData;

インスペクターで蛇口ハンドル用の ItemData を指定します。

Start() / ReStart() に追加

handleData.IsSpawned = false;
handleData.IsPicked = false;

👉 ゲーム開始時はハンドルは未出現・未取得

ハンドル取得時の処理を追加

handleData.IsSpawned = true;

木の棒で取れる状態になったタイミングで
アイテムを出現可能にします

ItemPickup.cs に SpawnSystem 対応を追加

OnClick() を修正

// スポーン管理アイテムは出現前なら取得不可
if (itemData.UseSpawnSystem && !itemData.IsSpawned) return;

itemData.IsPicked = true;

初期化処理の追加

public class ItemPickup : MonoBehaviour, IResettable

public void ResetObject()
{
}

public void ReStart()
{
 itemData.IsPicked =false;

if (itemData.UseSpawnSystem)
{
gameObject.SetActive(itemData.IsSpawned);
}
else
{
gameObject.SetActive(true);
}
}

動作確認チェック

  • ✅ タイトル戻る → 白フェード → タイトル画面
  • ✅ クリアBGM → メインBGMに切り替わる
  • ✅ 取得アイテムが初期配置に戻る
  • ✅ 木の棒・水道ギミックが初期状態に戻る

まとめ

今回はゲームデータをリセットしてタイトルに戻る②として、

  • インターフェースによるギミック一括初期化
  • アイテムのスポーン管理と再配置
  • ゲームを完全に初期状態へ戻す仕組み

を解説しました。

これで🎉 「1つのシーンで完結する2D脱出ゲーム講座」は完結です!

今後、南京錠ギミック・扉のボタン・暗証番号ギミックなどは 別記事として追加予定です。


【Unity6】1つのシーンで完結する2D脱出ゲーム講座一覧はこちら

コメント

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