Unityで3D脱出ゲーム

Unity 3D脱出ゲームの作り方30:パスワード入力の実装と宝箱を開ける処理の方法

Unityで作る3D脱出ゲームの作り方を紹介している記事その30です。

僕が所属しているオンラインサロンの
先生である嶋津さんが作成された動画を
見ながら勉強した内容について、

3D脱出ゲームの作り方

としてまとめている記事になります。

その30となるこの記事では、

パスワード入力の実装と宝箱を開ける処理の方法

についてお伝えしています。

参考となる動画はこちらです。

【Unity】ライブで教材制作!脱出ゲーム制作の残りを終わらせるぞ!パート2

このページでお伝えしている内容は、
動画の最初から36分位までの内容になります。

Udemyで学習されている方は、
セクション14の105〜108までの
内容となります。

この動画で勉強すること

▶︎パスワード入力の実装と正解時に宝箱を開ける処理について学ぶ。

目標1

パスワードギミックのパネルUIを作成する。

=>LeftChestを一度削除して、RightChestをコピーする

=>RightChestとLeftChestのBox Colliderの位置を修正する

=>LeftChestのZoomCameraを用意する

  =>RightChestの方にあるZoomCamera(SubCamera)を複製して位置を調整する

  =>名前をそれぞれLeftSubCameraとRightSubCameraに変更する

  =>LeftChestにLeftCameraを渡してあげる

=>LeftChestのPanelの下についているKeyを削除する

=>Panelのサイズを大きくする

=>Panelの下にCubeを作成して配置する

=>Cubeのサイズを調整する

=>Cubeに3DのTextMeshProをつける

=>テキストを数字の0に変更してサイズと位置を調整する

=>CubeにEvent Triggerをつける

=>Event TriggerをPointer Clickで設定

=>Cubeを複製して横に4つ並べる

目標2

パスワードギミックのボタンをクリックした時に数字が変わるようにする。

=>C#スクリプトを作る (PasswordPanel)

=>C#スクリプトを作る (DialNumber)

=>DialNumberスクリプトにコードを書く(ボタンを押すと数字が増える処理など)

=>Cube4つを選択してDialNumberスクリプトを付ける

=>Cube4つのEvent Triggerを設定する

=>Cube4つのInspecterでスクリプトの欄にTextMeshProを設定する

=>文字の表示修正を行う(RotationのYを180に)

=>DialNumberスクリプトにコードを書く(数字が10になった時に0に戻す処理)

目標3

パスワードが正解か判定する処理を作る

=>PasswordPanelスクリプトにコードを書く(パスワードが正解かの判定を行う処理)

=>Cubeの名前をDialButtonに変更する(それぞれ0~3の番号を付ける)

=>Panelの名前をPasswordPanelに変更する

=>PasswordPanelのEvent TriggerとBox Colliderをリムーブコンポーネントする

=>PasswordPanelのInspecterにDialButtonを4つ登録する

=>4つのDialButtonのEvent Triggerを増やして設定する

目標4

パスワードが正解した時に宝箱を開ける処理を作る。

宝箱に鍵を使った時の処理を改めて作成する

 =>C#スクリプトを作成する(KeyPanel)

 =>KeyPanelスクリプトにコードを書く

 =>Chestスクリプトのコードを編集する(Open関数)

 =>鍵の宝箱にKeyPanelスクリプトを付ける

 =>Event Triggerを改めて設定

 =>InspecterでRightChestを入れてあげる

パスワードが正解したら宝箱を開ける処理を作成する

=>PasswordPanelスクリプトのコードを編集する

 =>PasswordPanelのInspecterでLeftChestを入れてあげる

PasswordPanelスクリプトのコード

パスワードギミックを実装するために
作成したPasswordPanelスクリプトの
コードは以下となります。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PasswordPanel : MonoBehaviour
{
    //正解と一致しているか管理するためのもの

    [SerializeField] Chest chest = default; //正解時に開ける宝箱を設定する

    //正解の数字
    int[] correctAnswer = { 3, 0, 1, 1 };

    //ユーザの入力
    [SerializeField] DialNumber[] dialNumbers = default;

    public void OnClickButton()
    {
        if (CheckClear())
        {
            // 宝箱を開ける
            //Debug.Log("クリア!");
            chest.Open();
        }
    }

    //正解とユーザの入力を確かめる
    bool CheckClear()
    {
        for (int i = 0; i < dialNumbers.Length; i++)
        {
            if(dialNumbers[i].number != correctAnswer[i])
            {
                return false; //一致しない場合
            } 
        }
        return true;
    }
}

DialNumberスクリプトのコード

パスワードのボタンを押した時の
処理などを実装するために作成した
DialNumberスクリプトのコードは
以下となります。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using TMPro;

public class DialNumber : MonoBehaviour
{

    [SerializeField] TMP_Text numberText = default; //表示するためのもの
    public int number = 0; //数字

    //クリックされると数字を増やす
    public void Onclick()
    {
        number++; //numberに1を足す

        if(number > 9) //numberが9を超えたら0に戻す
        {
            number = 0;
        }

        numberText.text = number.ToString(); //数字をテキストに反映して表示する
    }
}

KeyPanelスクリプトのコード

鍵の宝箱の処理を実装するために作成した
KeyPanelスクリプトのコードは
以下となります。

#25カメラのズーム機能を参考に
した場合は、宝箱が開いた時に
RedTileを表示させるようにしています。

そのためChestスクリプトに
書いていたコードを追加しています。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class KeyPanel : MonoBehaviour
{
    [SerializeField] Chest chest = default; //開ける宝箱を設定する
    [SerializeField] GameObject redTile = default; //#25カメラのズーム機能を参考にした場合のみ記述

    //クリックされた時に、鍵を持っていれば、宝箱を開ける
    public void OnClick()
    {
        // keyアイテムを選択していたら
        if (ItemBox.instance.CheckSelectItem(Item.Type.Key))
        {
            ItemBox.instance.UseSelectItem();
            redTile.SetActive(true); //#25カメラのズーム機能を参考にした場合のみ記述
            //宝箱を開ける
            chest.Open();
        }
    }
}

Chestスクリプトのコード

今回編集したChestスクリプトの
コードは以下となります。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Chest : MonoBehaviour
{
    
    // 開ける=アニメーション
    [SerializeField] Animation anim = default;

    public void Open()
    {
        anim.Play(); //アニメーションを再生する
    }
}

パスワード入力の実装と宝箱を開ける処理の作成で勉強したことのまとめ

3D脱出ゲームの作り方その30
「パスワード入力の実装と宝箱を開ける処理の方法」
で勉強した内容についてのまとめです。

パスワード入力を実装するには、
 まず最初にパスワードパネルの
 UIを作成します。

次にパスワードのボタンを
 クリックした時の処理を行うために
 C#スクリプトを作成してコードを書きます。

パスワードボタンの処理が
 実装できたら、

 次は入力したパスワードが
 正解しているかどうかを
 判定する処理を作成します。

 そのためにC#スクリプトを作り
 コードを書きます。

そして最後にパスワードが
 正解した時に宝箱を開ける
 処理を作成します。

以上で、パスワード入力の実装と
正解した時に宝箱を開ける処理を
実装することができました。

パスワードの宝箱の画像
パスワードが正解して開いた宝箱の画像

「パスワード入力の実装と宝箱を開ける処理の方法」
の目標は以上で達成です!

-Unityで3D脱出ゲーム