Unityで3D脱出ゲーム

Unity 3D脱出ゲームの作り方31:アイテムを置いてイベントを発生させる方法

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

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

3D脱出ゲームの作り方

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

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

アイテムを指定場所へ置いた時にイベントを発生させる方法

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

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

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

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

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

この動画で勉強すること

▶︎コインを台へ置いた時にドアを開けるアニメーションを再生する方法を学ぶ。

目標1

コインを宝箱に入れる。

=>コインを動かして宝箱に入れる

YouTubeの#25の動画を参考にした場合

=>宝箱に入れたコインのレイヤーをGimmickに変更する

=>コインを消す

=>PassWordPanelスクリプトにコードを書く(宝箱が開いた時にコインを表示する処理)

目標2

コイン台へのズーム機能を作る。

=>ItemBoxCanvasを一時非表示にする(作業をやりやすくするため)

=>HierarchyでPlate(1)を選びUnpackPrefabをする

=>Plate(1)についているBox Colliderを大きくする

=>Main Cameraでクリックできない場合はLayerを変更する(CameraZoomObj)

=>Event Triggerを着けてPointer Clickで設定できるようにする

=>Zoom CameraSetterスクリプトをつける

=>Event Triggerを設定する

=>Plate(1)の子要素にCameraを作成する(SubCamera)

=>SubCameraにPhysics Raycasterをつける

=>SubCameraの位置や角度を調整する

YouTubeの#25を参考にした場合

=>宝箱で作ったカメラ(LeftSubCamera)をコピーしてPlateの中に入れる(子要素にする)

=>名前を変更してCamera位置を調整する

=>CoinSetCubeのLayerをGimmickに変更する

目標3

コインを選択して台座をクリックした時にログを出す処理を作る

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

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

=>HierarchyでCubeの名前をCoinSetCubeに変更する

=>CoinSetCubeにEvent Triggerを設定する

目標4

コインを設置して表示させる。

=>CoinSetCubeの子要素にCoinのプレファブを配置する

=>Coinをアンパックプレハブする

=>SetItemスクリプトにコードを書く(SetCoin関数)

=>表示するコインをインスペクターで設定する

目標5

ドアのアニメーションを作る。

=>ドアの名前をDoorに変更する

=>Doorを選択した状態でWindowのAnimationからAnimationを選択

=>Animationウインドウが開いたらCreateをクリック

=>OpenDoorという名前を付けて保存

=>ドアのアニメーションを作る

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

=>Doorオブジェクトにスクリプトを付ける

=>Doorスクリプトにコードを書く(ドアのアニメーションを再生する処理)

=>DoorについているAnimatorをリムーブコンポーネントする

=>DoorにAnimationコンポーネントをアドコンポーネントする

=>Animationコンポーネントに再生したいOpenDoorを設定する

=>OpenDoorを選んでLoop Timeのチェックを外す

=>さらにDebugモードにしてLegacyにチェックを入れる

=>Legacyにチェックを入れたらDebugからNormalに戻す

目標6

コインの設置でドアのアニメーションを再生させる。

=>SetItemスクリプトにコードを書く(Unity Event)

=>インスぺクターでUnityEventの設定をする

目標7

ドアが開いた後のクリア判定を作る。

=>HierarchyでCubeを作成する

=>ドアの後ろにCubeを配置して大きさを調整する

=>Cubeの名前をClearPanelに変更する

=>InspectorのCube(Mesh Filter)とMesh Rendererをリムーブコンポーネントして透明にする

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

=>Hierarchyに空のオブジェクトを作り、GameManagerに名前を変更する

=>GameManagerに「GameManagerスクリプト」をつける

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

=>ClearPanelにEvent Triggerを設定する

=>Clear PanelのLayerを変更してMainCameraでクリックできるようにする。(CanMainCamera)

目標8

ドアのクリック判定のエラー修正をする。

=>ClearPanelを非表示にする

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

SetItemスクリプトのコード

コインを台座へ置く処理を
実装するために作成した
SetItemスクリプトの
コードは以下となります。

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

public class SetItem : MonoBehaviour
{
    //コインを選択状態で、クリックすると、コインが出現する

    [SerializeField] GameObject coin = default; //表示させるコインの設定

    public UnityEvent ClearEvent; // 外部から関数を登録する

    public void OnClickObj()
    {
        // Coinアイテムを選択していたら
        if (ItemBox.instance.CheckSelectItem(Item.Type.Coin))
        {
            ItemBox.instance.UseSelectItem();
            SetCoin();
            ClearEvent.Invoke(); //実行する
        }
    }

    void SetCoin()
    {
        coin.SetActive(true); //コインを表示する
    }
}

Doorスクリプトのコード

ドアのアニメーションを再生する
処理等を実装するために作成した
Doorスクリプトのコードは
以下となります。

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

public class Door : MonoBehaviour
{
    Animation anim;
    [SerializeField] GameObject clearPanel = default;

    private void Start()
    {
        clearPanel.SetActive(false); //ClearPanelを非表示にする
        anim = GetComponent<Animation>(); //変数animにコンポーネントのAnimationを入れる
    }

    public void Open()
    {
        anim.Play();
        clearPanel.SetActive(true); //ClearPanelを表示する
    }
}

GameManagerスクリプトのコード

クリア判定の処理を実装するために
作成したGameManagerスクリプトの
コードは以下となります。

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();
        }
    }
}

PassWordPanelスクリプトのコード

YouTubeの#25の動画を参考にした
場合に編集するPassWordPanelの
コードは以下となります。

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

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

    [SerializeField] Chest chest = default;

    [SerializeField] GameObject coin = default; //宝箱に入れるコインの設定

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

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

    public void OnClickButton()
    {
        if (CheckClear())
        {
            // 宝箱を開ける
            //Debug.Log("クリア!");
            chest.Open();
            coin.SetActive(true); //宝箱が開いた時にコインを表示する
        }
    }

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

アイテムを置いてイベントを発生させる方法の作成で勉強したことのまとめ

3D脱出ゲームの作り方その31
アイテムを指定場所へ置いた時にイベントを発生させる方法
で勉強した内容についてのまとめです。

まず最初に設置する場所への
 カメラズーム機能を作ります。

次にコインを選択して台座へ
 置いた時にログを出す処理を
 作るため、C#スクリプトを
 作成してコードを書きます。

コインを置いた時にログを
 出すことができたら、次は台座へ
 置いたコインを表示させる
 処理を作ります。

さらにコインを置いた時に
 ドアを開く処理を作るため、
 次はドアのアニメーションを作成します。

ドアを開けるアニメーションを
 作成できたら、

 コインを台座へ置いた時に
 アニメーションが再生されるように
 スクリプトへコードを書きます。

そして最後にクリア処理を
 作るために、ドアの後ろへ見えない
 オブジェクを配置して、

 それをクリックした時に
 クリア判定が起こる処理を作成します。

以上で、コインを配置した時に
ドアが開くアニメーションを
再生することができます。

コインを置く台にズームした画像
台にコインをおいてドアが開いた画像

そして、ドアが開いた場所を
クリックすることでクリア判定の
ログが出るようになりました。

クリアログが出た画像

アイテムを指定場所へ置いた時にイベントを発生させる方法
の目標は以上で達成です!

-Unityで3D脱出ゲーム