Unity

【脱出ゲーム制作9】パスワードギミックの作成

パスワードギミックを作成する

前回は、選択したアイテムを拡大表示し、マウスで回転させる機能を作成しました

今回はパスワードギミックを実装します。

4桁の数字を入力し、正しい組み合わせにすると木箱が開くギミックを作成します。
数字はクリックで変更できるようにします。

ギミックの作成手順

作成手順は以下のようになります

  • パスワードを表示する枠を作成
  • 各桁の数字を表示するTextを作成
  • クリックで数字を変更し、正解なら木箱が開くスクリプトを作成

木箱が開くアニメーションの作成方法については【脱出ゲーム制作2】で解説しています。

下準備

まずは以前作成した木箱『WoodenBoxSet』を複製します。

向かい側に配置

現在ズームした後、クリックするだけでフタが開くようになっています。
クリックしただけで開いてしまっては困るので、WoodenBoxのEventTriggerとBoxColliderをRemoveComponentを選び削除します。
(木箱にズームするための親のWoodenBoxSetのBoxColliderは消さない)

4桁の数字を表示する枠の作成

パスワードギミックの枠を木箱に上に作成します

オブジェクトで枠を作成

今回は木箱のフタの上にパスワードギミックを配置したいので、
WoodenFUTAを選択し右クリック、3Dオブジェクト→Cubeで白い大枠を作成し、位置やサイズを調整

さらにその下にCubeを作成しサイズや位置を調整
大枠に重ならないようにY軸を少しずらす

大きさの数字は目安、横に4つ並べられるサイズにしよう

黒いMaterialを作成

新しくMaterialを作成し、BaseMapを黒にする

Cubeにマテリアルをドラッグし適用

白い大枠の名前を『PasswordPanel』、黒い枠の名前を『DialButton』に変更

数字を表示するTextを作成

枠を作成したので数字をTextMeshProで作成

黒い枠を選択し3Dオブジェクト→TextMeshPro
Import TMP Essentialsを選択しインポート

TextのRotationを調整し正しい向きにし、枠に重ならないようにY軸を少しずらす

Alignmentの縦横をどちらも中央にし、Fontsizeを黒枠に収まるように調整
入力文字を『9』にする

Ctrl+Dで4つに複製し位置を調整

スクリプトを作成

続いてスクリプトを作成していきます。

クリックで数字を加算させる

まずは作成したTextの数字をクリックで加算させるスクリプトを作成します

新しくDialNumber.csを作成

DialNumber.cs
using TMPro;
using UnityEngine;

public class DialNumber : MonoBehaviour
{
    [SerializeField] TMP_Text numberText;
    int number = 0;

    // クリックされると数字を増やす
    public void OnClick()
    {
        number++;
        numberText.text = number.ToString();
    }
}

黒枠のDialButtonにDialNumber.csをアタッチし、NumberTextに子要素のTextを設定。

EventTriggerを追加し、OnClickメソッドを選択

他の3つのDialButtonに設定し忘れないようにしよう(実体験)

実行

加算させる数字を9までにする

現在クリックし続けると9以上になってしまっているのでIF文で『0』に戻るようにします。
また、ゲーム開始時の初期値も0にします。

DialNumber.cs
using TMPro;
using UnityEngine;

public class DialNumber : MonoBehaviour
{
    [SerializeField] TMP_Text numberText;
    public int number = 0;

    void Start()
    {
        // 初期値を0にする
        numberText.text = number.ToString();
    }
    // クリックされると数字を増やす
    public void OnClick()
    {
        number++;
        // 9の時にクリックされたら0にする
        if (number > 9)
        {
            number = 0;
        }
        numberText.text = number.ToString();
    }
}

パスワードの判定を行う

正解のパスワードを設定し、入力した4桁の数字があっているか確かめるようにします

新しくPasswordPanel.csを作成

PasswordPanel.cs
using UnityEngine;

public class PasswordPanel : MonoBehaviour
{
    // 正解の数字
    int[] currectAnswer = { 2, 0, 0, 0 };

    [SerializeField] DialNumber[] dialNumbers;

    // 正解とユーザの入力を確かめる
    public void OnClickButton()
    {
        if (CheckClear())
        {
            // 宝箱を開ける
            Debug.Log("宝箱を開ける");
        }
    }

    // 正解かどうか
    bool CheckClear()
    {
        for (int i = 0; i < dialNumbers.Length; i++)
        {
            if (dialNumbers[i].number != currectAnswer[i])
            {
                return false; // 一致しないものがあれば不正解
            }
        }
        return true;
    }
}

for文で4桁の数字をcurrectAnswerと同じか確認し、すべて合っていた場合『true』を返す
『true』だった場合、”宝箱を開ける”とログを表示する

PasswordPanel.csを大枠のPasswordPanelにアタッチする

インスペクターのDialNumbersにDialButtonを4つドラッグして設定する

DialButtonのEventTriggerにOnClickButtonメソッドを追加する

数字を加算と、正解のチェックを同時に行う

正しいパスにしたらConsoleにログが出た

正解したらフタが開くようにする

木箱に設定されているスクリプトはこのようになっている

WoodenBox.cs
using UnityEngine;

public class WoodenBox : MonoBehaviour
{
    [SerializeField] Animator animator;
    bool isOpen = false;

    public void OnClickObj()
    {
        if (isOpen)
        {
            Close();
        }
        else
        {
            Open();
        }
    }

    void Open()
    {
        isOpen = true;
        animator.Play("OpenWoodenBox");
    }

    void Close()
    {
        isOpen = false;
        animator.Play("CloseWoodenBox");
    }
}

Openメソッドを正解時に実行させるようにする

PasswordPanel.cs
using UnityEngine;

public class PasswordPanel : MonoBehaviour
{
    int[] currectAnswer = { 2, 0, 0, 0 };

    [SerializeField] DialNumber[] dialNumbers;

    // 木箱を取得する
    [SerializeField] WoodenBox woodenBox;

    public void OnClickButton()
    {
        if (CheckClear())
        {
            // WoodenBoxのOpenを実行
            woodenBox.Open();
        }
    }

    bool CheckClear()
    {
        for (int i = 0; i < dialNumbers.Length; i++)
        {
            if (dialNumbers[i].number != currectAnswer[i])
            {
                return false;
            }
        }
        return true;
    }
}

SerializeFieldで木箱を取得し、正解ならWoodenBoxのOpenを実行

エラーが出るのでWoodenBox.csのOpenメソッドをpublicにする

WoodenBox.cs
using UnityEngine;

public class WoodenBox : MonoBehaviour
{
    [SerializeField] Animator animator;
    bool isOpen = false;

    public void OnClickObj()
    {
        if (isOpen)
        {
            Close();
        }
        else
        {
            Open();
        }
    }
    
    // publicにする
    public void Open()
    {
        isOpen = true;
        animator.Play("OpenWoodenBox");
    }

    void Close()
    {
        isOpen = false;
        animator.Play("CloseWoodenBox");
    }
}

インスペクターのWoodenBoxに該当のものを設定する

WoodenFUTAにWoodenBox.csがアタッチされているのでFUTAをセット

実行

正解のパスワードにしたら箱が空いた!

まとめ

今回の実装では、脱出ゲームで定番の4桁のパスワードギミックを追加しました。プレイヤーは数字をクリックで変更し、正しい組み合わせを入力することで木箱が開く仕組みになっています。

このギミックを活用すれば、メモや部屋の中に隠されたヒントをもとにパスワードを解読する仕掛けや、他のアイテムと組み合わせて解く謎など、ゲームに奥行きを持たせることができます。

とりあえず今回はここまで

参考にさせていただきました。

COMMENT

メールアドレスが公開されることはありません。 が付いている欄は必須項目です