現場レベルのゲーム制作が、すべてここで学べます。
この記事は、Unity ホラー風脱出ゲームの作り方をわかりやすく解説していくシリーズの第9回です。
前回の記事では、ゴールの表示からフェードアウトまでの クリア演出 を実装し、ゲームとしてひとつの流れが完結するように仕上げました。
ゴール出現とフェード処理が連動することでプレイ感にメリハリが生まれ、作品の完成度をさらに高めました。
前回の記事:

今回は、初めてプレイするユーザーにはルールや操作が分かりにくい現状を改善していきます。
案内板や操作説明といったガイド要素を追加し、ゲーム全体のユーザビリティを大きく向上させるパートへ進みます。
案内盤を作成する
まず、Projectウィンドウから Assets > Prefab フォルダを開き、その中にある 「Room_Start」プレハブ をダブルクリックして開きましょう。

次に、Hierarchyから Canvas の子オブジェクト「Corridor number B」 を選択し、CTRL + D で複製します。
複製したオブジェクトの名前を 「InformationBoard_A」 に変更しましょう。

Hierarchy で 「InformationBoard_A」 を選択し、Inspector の RectTransform を次のように設定しましょう。

「InformationBoard_A」の子オブジェクトである Text を、Hierarchy で選択し、Inspector から次のように設定しましょう。Tag設定を変更するのを忘れずに。

|
1 2 3 4 |
異変を見逃すな 異変を見つけたら引き返せ 異変がなければ前へ進め 八番廊下からでること |
次に、Hierarchy から「InformationBoard_A」を選択し、CTRL + D で複製します。複製したオブジェクトの名前を「InformationBoard_B」に変更しましょう。

Hierarchy で 「InformationBoard_B」 を選択し、Inspector の RectTransform を次のように設定しましょう。

現在のままでは UI が発光しており、ゲームの世界観から浮いて見えてしまいます。そこで、UI に専用のマテリアルを適用します。
Project ウィンドウで Assets フォルダ内の Materials フォルダを開き、右クリックして Create > Material を選択し、作成したマテリアルの名前を「UI_Material」に変更しましょう。

Project ウィンドウから「UI_Material」を、Hierarchy 内の
「Corridor number A」
「Corridor number B」
「InformationBoard_A」
「InformationBoard_B」
の4つのInspectorないのMaterialにそれぞれドラッグ&ドロップして適用しましょう。


すると、文字が重なり合ってしまい、次のように表示が競合してしまいます。

CTRL を押しながら、Hierarchy で
「Corridor number A」
「Corridor number B」
「InformationBoard_A」
「InformationBoard_B」
の子オブジェクトである Text を順にクリックし、RectTransform を次のように設定しましょう。


操作案内 UI を作成する
まずは Hierarchy 左上の矢印ボタンをクリックして、Room_Start プレハブの中から一度抜け出しておきましょう。

Hierarchy から Canvas を選択し、右クリックして UI > Text – TextMeshPro を選択しましょう。作成した UI の名前を「WASDGuide_UI」に変更します。

作成した「WASDGuide_UI」を選択し、Inspector から次のように設定しましょう。

Project ウィンドウから script フォルダを開き、
その中で右クリックして Create > MonoBehaviour Script を選択しましょう。
作成されたスクリプトの名前を HideOnKeyOnce に変更します。
スクリプトを作成できたら、ダブルクリックして開きましょう。
すると、Visual Studio(もしくはUnity に設定している外部エディタ) が起動し、
HideOnKeyOnce.cs のコード編集画面 が開きます。

以下を「HideOnKeyOnce」に記述しましょう。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 |
using UnityEngine; using UnityEngine.InputSystem; public class HideUIOnKeyOnce : MonoBehaviour { [Header("非表示のきっかけとなる InputAction")] [Tooltip("例:AnyKey / Confirm / Move など。\nキーが押されると UI を一度だけ非表示にします。")] public InputActionReference action; [Header("非表示にしたいUI")] [Tooltip("未指定の場合、このGameObject自身を非表示にします。")] public GameObject target; // すでに一度非表示にしたかどうか(連続で消えないようにするため) private bool _alreadyHidden = false; private void Awake() { // UI の指定がなければ、このスクリプトがついているオブジェクトを対象にする if (target == null) { target = gameObject; } } private void OnEnable() { // InputAction がちゃんと設定されているか確認 if (action != null && action.action != null) { // キーが押されたら OnPerformed を呼ぶ action.action.performed += OnPerformed; // 無効化されている場合は有効化しておく if (!action.action.enabled) { action.action.Enable(); } } } private void OnDisable() { // OnEnable で登録したイベントを解除しておく(お作法) if (action != null && action.action != null) { action.action.performed -= OnPerformed; } } /// <summary> /// 指定された InputAction が発動したときに呼ばれる /// </summary> private void OnPerformed(InputAction.CallbackContext _) { // 一度隠した後は何もしない if (_alreadyHidden) return; _alreadyHidden = true; // 対象の UI を非表示にする if (target != null) { target.SetActive(false); } } } |
スクリプトの解説
「指定したキーが押されたら、一度だけ UI を非表示にする」
それだけをシンプルに実現するスクリプトです。
操作説明UI(WASDガイドなど)に最適で、
ゲーム開始直後にプレイヤーがキーを押したタイミングで説明UIを消す場面で使います。
InputAction の参照
|
1 |
public InputActionReference action; |
-
どのキー入力をトリガーにするかを指定する
-
例)AnyKey / Move / Confirm など
-
ここで設定した InputAction が押された瞬間にUIが消えます
対象の UI
|
1 |
public GameObject target; |
-
非表示にしたい UI を指定
-
何も指定しない場合は このスクリプトが付いているオブジェクト自身が対象
一度だけ消すためのフラグ
|
1 |
private bool _alreadyHidden = false; |
-
UI を一度消したあとは、
どんなにキーを押されても再実行されないようにするための変数
Awake()
|
1 2 3 4 |
if (target == null) { target = gameObject; } |
UI が指定されていなければ、
自分自身を対象にする(操作ミスを防止)
OnEnable()
|
1 2 |
action.action.performed += OnPerformed; action.action.Enable(); |
-
InputAction が押されたときに OnPerformed() が呼ばれるよう登録
-
無効なら action を有効化(Enable)する










コメント