Unity ホラー風脱出ゲームの作り方5 8番出口ライクゲーを実現しよう!どんな異変も自由に作れる汎用システムを構築 | Unity入門の森 ゲームの作り方

Unity ホラー風脱出ゲームの作り方5 8番出口ライクゲーを実現しよう!どんな異変も自由に作れる汎用システムを構築

Unity ホラー風3D脱出ゲームの作り方 ~8番ライクゲーを作りながらポストプロセスや音響表現をマスターしよう~

現場レベルのゲーム制作が、すべてここで学べます。

【永久会員チケット】

永久会員チケット|Unity入門の森

全講座を見放題で学ぶ

ソースコード・素材・プロジェクトすべて公開。
Unityの基礎から応用まで、一生使えるスキルを体系的に習得。

この記事は、Unityを使った「8番出口」ライクなホラー風脱出ゲームの作り方講座第5回です。

前回は、エリアごとに音の響きを変えるリバーブを設定し、シーン全体の臨場感をアップさせました。その結果、“ホラーらしい雰囲気”が一気に引き立ちました。

前回の記事:

Unity ホラー風脱出ゲームの作り方4 Unity Audio Reverbと環境音で“恐怖の演出”を実現する
この記事は、Unity ホラー風脱出ゲームの作り方をわかりやすく解説していくシリーズの第4回です。前回はマップの作成とライティング、ポストプロセス、そしてハンドライト(懐中電灯)を導入して、視覚的に“ホラーらしい雰囲気”を仕上げました。前回...

今回は、ついに“異変”が発生する仕組みを実装していきます!

【ゲームの作り方講座プレゼント中!】

“異変”の発生を制御するアルゴリズムを作成

まず、”異変”とは簡単に言うと入室するたびに生じる部屋の変化のことです。入室するたびに部屋が変化してるかどうかをチェックし、部屋が変化していれば来た道を引き返す。変化していなければ先に進む。

これを繰り返すのが8番ライクと呼ばれる8番出口風ゲームの特徴です。

アルゴリズムとしては、大まかに以下のような流れになっています。

① 入室時のトリガー

 プレイヤーが部屋に入る少し手前で「スタートフラグ」が呼び出され、異変の処理がスタートします。

② ランダム判定

 その部屋で“異変が起こるかどうか”、さらに“どの異変が発生するのか”をランダムに決定します。

③ 異変の適用

 選ばれた異変の内容を実際にゲーム内へ反映し、空間の雰囲気やオブジェクトが変化します。

④ 退室時のトリガー

 プレイヤーが部屋を出るタイミングで「エンドフラグ」が呼び出され、異変の処理を終了します。

⑤ 状態のリセット

 適用されていた異変の効果を元に戻し、次の部屋でも同様の判定が行えるようにリセットします。

このようなアルゴリズムを、実際に C# で実装 していきましょう。

異変を管理するスクリプトを作成する

まずは Projectウィンドウ を開き、以前作成した「script」フォルダを開きましょう。

フォルダ内には、これまでに作成した 「PlayerCTRL」「ReverbByFloorRay」 のスクリプトがあるはずです。

次に、空いているスペースで 右クリック「Create」>「MonoBehaviour Script」 を選択します。

新しく作成されるスクリプトの名前を 「EventManager」 に変更しましょう。

作成した 「EventManager」 スクリプトを ダブルクリック で開きましょう。

これで、スクリプトエディタ(通常は Visual Studio や Rider など)が起動します。

ここから実際に、異変の発生や制御を行うための処理を書いていきます。

前回までに行った「リバーブ判定」や「プレイヤーの操作処理」と同様に、

このスクリプトでもゲーム内の動きを支える重要な部分を担当します。

下記のスクリプトを記述してください。このコードが、異変を管理する基本的な仕組みとなります。

スクリプトの解説

先に EventManager の考え方を理解しておきましょう。

いまは MapAnomalyListSaveValue を用意していないため、エラーになりますが、ここでは流れをつかむことを目的に解説します。

何をするスクリプト?
  • 部屋に入る/出るをトリガーにして、

    • 異変(=マップ差し替え)を適用し、

    • 退室時に元に戻す

      までを一括管理する「イベント(異変)マネージャ」です。

  • 異変の出現はランダム。異変なしが連続したときは、次第に“異変あり”が出やすくなる確率調整を行うことで単調さを回避します。

主なフィールド(Inspectorで見るところ)
  • currentAnomalyIndex:現在の異変(何番の異変が適用中か)

  • nextAnomalyForced / number:デバッグ用。次の異変を強制指定したいときに使う(nextAnomalyForcedがONならnumberを採用。Unity内インスペクターから制御可能)

  • FirstNumber:ゲーム開始時に最初に適用する異変番号(異変なしの基本状態を0とする)

  • MapAnomalyList:異変のリスト。

    • 各異変は消すオブジェクト(DelObj)と表示するオブジェクト(AddObj)のセットで表現

  • startA, startB / endA, endB

    • 入室/退室のトリガー用オブジェクト(アクティブ切替でフラグ管理)

ランダム制御のパラメータ

  • baseNoAnomalyProb:異変なし(0)の基本確率(初期の出やすさ)

  • minNoAnomalyProb:どれだけ連続しても下回らない下限

  • decayPerStreak:0が続くたびに確率へ掛ける係数(例:0.5なら半減)

  • noAnomalyStreak:直近で0が何連続かのカウンタ

実行の流れ
  • Start()

    • currentAnomalyIndex = FirstNumber を適用して最初の異変を反映(ApplyAnomaly()

    • 退室フラグ(endA/endB)をOFF、入室待ちの状態に

  • roomStart(int a)(入室トリガーで呼ぶ想定)

    • RandomMap():次の異変を決定

    • 入室トリガー startA/BOFF、退室トリガー endA/BON

  • roomEnd(int a)(退室トリガーで呼ぶ想定)

    • RecoverMap():適用した異変を元に戻す

    • 入室トリガー startA/BON、退室トリガー endA/BOFF

重要メソッドの中身
RandomMap()(次の異変を決める)
  1. デバッグ強制

    • nextAnomalyForced が true なら number をそのまま採用 → ApplyAnomaly() で即適用

  2. 異変なし(0)の確率を調整

    • 現在の0確率 = max(minNoAnomalyProb, baseNoAnomalyProb * pow(decayPerStreak, noAnomalyStreak))

    • 抽選で0が出たら

      • currentAnomalyIndex = 0

      • noAnomalyStreak++(0連続カウント増やす)

      • ApplyAnomaly() で適用して return

    • 0以外が出た場合は noAnomalyStreak = 0 にリセット

  3. 未使用マップからランダム選択

    • SaveValue.usedMaps に入っていないインデックスだけ candidates に集める

    • 使い切っていたら「すべてのマップを出し終えました」として currentAnomalyIndex = 0(異変なし)

    • 候補からランダムに1つ選んで currentAnomalyIndex に設定 → ApplyAnomaly() で適用

ApplyAnomaly()(異変の適用)
  • MapAnomalyList[currentAnomalyIndex]

    • DelObj非アクティブ

    • AddObjアクティブ

      に切り替える

RecoverMap()(元に戻す)
  • 直前に適用した DelObj再表示SetActive(true)

  • 直前に適用した AddObj非表示SetActive(false)

 

補足:foreachとは?

スクリプト内では、

のように何度も foreach が登場します。

この構文は、リストや配列などに入っているすべての要素を順番に取り出して処理するための書き方です。

上の例では、MapAnomalyList[currentAnomalyIndex].DelObj に含まれるすべてのオブジェクトを1つずつ obj として受け取り、SetActive(false) を実行しています。つまり「リストに入っているオブジェクトを全部非表示にする」という動きになります。

通常の for 文よりもコードが短く、意図が分かりやすいのが特徴です。

リストの中身を順番に処理したいときは、foreach を使うのが基本的で安全な方法です。

減衰つきランダムの意図(ゲーム体験のための工夫)
  • 単純なランダムだと「いつまでも何も起こらない」偏りが発生することがある

  • このスクリプトは、“異変なし(MapAnomalyList[0])”が続くほどMapAnomalyList[0]の確率を下げる

    一定間隔で異変が起きやすくなり、体験のテンポが保たれる

  • baseNoAnomalyProb / minNoAnomalyProb / decayPerStreak を調整すれば、

    緊張と緩和のリズムを好みに合わせて設計可能

異変を管理するリストを作成

「EventManager」を作成したときと同じように、まず「script」フォルダ を開きましょう。

フォルダ内の空いているスペースで 右クリック「Create」>「MonoBehaviour Script」 を選択します。

作成されたスクリプトの名前を 「MapAnomalyList」 に変更してください。

次に、作成した 「MapAnomalyList」 スクリプトを開き、

下記のコードを記述してください。

続きを読む
このコンテンツはパスワードで保護されています。 コンテンツを読みたい方はUnity入門の森ショップ(https://unityforest.shop/)で講座閲覧権を取得してね。

まとめと次回予告

今回は、異変のアルゴリズムを実装し、実際に異変を発生させるところまで進めました。

次回はまず、正解/不正解を判定する仕組みを導入して、プレイヤーが異変を見つけたかどうかを判定します。

また、「今、何番出口か」を表示するカウンターを実装し、進行度を常に把握できるようにします。

さらに、現状は前後の向きが分かりにくいため、進行方向側に「Exit」看板を表示して方向を明確化していきます。

次回の記事↓

Unity ホラー風脱出ゲームの作り方6 3Dワールド空間にテキストオブジェクトを配置して異変発見を表示する
この記事は、Unity ホラー風脱出ゲームの作り方をわかりやすく解説していくシリーズの第6回です。前回は、異変のアルゴリズムを実装し、実際に異変を発生させるところまで進めました。前回の記事:今回は、プレイヤーが異変を見つけたかを判定する仕組...

Unity ホラー風3D脱出ゲームの作り方講座に戻る >>

【ゲームの作り方講座もプレゼント中!】

現場レベルのゲーム制作が、すべてここで学べます。

【永久会員チケット】

永久会員チケット|Unity入門の森

全講座を見放題で学ぶ

ソースコード・素材・プロジェクトすべて公開。
Unityの基礎から応用まで、一生使えるスキルを体系的に習得。

コメント

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