Unityで3D脱出ゲーム

Unity 3D脱出ゲームの作り方その7:アイテムを使用する方法

2020年12月10日

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

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

3D脱出ゲームの作り方

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

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

アイテムを使用する方法

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

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

【Unity3D】脱出ゲームの作り方 # 07アイテムの使用

Udemyの場合は、
セクション5の43

「アイテムの使用#1」

セクション5の44

「アイテム使用#2汎用性向上」

の内容です。

スポンサーリンク

この動画で勉強すること

▶︎アイテムの使用ができるようにする。

目標1

アイテムを使用するギミックの用意をする。

=>Capsuleのオブジェクトを作る

目標2

C#スクリプトを作成して、
Capsuleのクリック判定が
できるようにする。

=>SampleGimmickスクリプトを作成する。

目標3

ギミックをクリアするアイテムを
持っているかの判定を行うコードを書く。

=>ItemBoxスクリプトの編集を行う。
=>Slotスクリプトの編集を行う。
=>SampleGimmickスクリプトの編集を行う

目標4

ギミックをクリアするアイテムを
使った時に、アイテムボックスから
消す処理を作る。

=>ItemBoxスクリプトの編集を行う。
=>Slotスクリプトの編集を行う。

SampleGimmickスクリプトのコード

アイテムの使用を行うために作成した
Capsuleに設定するC#スクリプト。

SampleGimmickに書いたコードは
以下となります。

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

public class SampleGimmick : MonoBehaviour
{
    // やりたいこと
    // アイテムCubeを持っている状態で、クリックすると消える
    // ・クリック判定
    // ・アイテム持ってますよ判定

    //ギミックを解除するアイテムを外で設定できるようにする
    [SerializeField] Item.Type clearItem = default;

    public void OnClickObj()
    {
        Debug.Log("クリックしたよ!");

        // アイテムCubeを持っているかどうか
        bool Clear = ItemBox.instance.TryUseItem(clearItem);
        if(Clear == true) // クリアアイテムを持っている場合
        {
            Debug.Log("ギミック解除");
            gameObject.SetActive(false);
        }
    }
}

ItemBoxスクリプトのコード

今回編集したItemBoxのコードは
以下となります。

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

public class ItemBox : MonoBehaviour
{
    [SerializeField] Slot[] slots = default;

    [SerializeField] Slot selectedSlot = null;

    // どこでも実行できるやつ
    public static ItemBox instance;
    private void Awake()
    {
        if (instance == null)
        {
            instance = this;

            // slotsにslot要素をコードからいれる方法
            slots = GetComponentsInChildren<Slot>();
        }
    }


    // PickupObjがクリックされたら、スロットにアイテムをいれる
    public void SetItem(Item item)
    {
        foreach (Slot slot in slots) // slotsの数だけ繰り返す
        {
            if (slot.IsEmpty()) //slotがもし空だった場合
            {
                slot.SetItem(item); //slotにアイテムを入れる
                break;              //空のスロットにアイテムを入れたら繰り返しを止める
            }

        }
    }


    //スロットが選択された時に実行する関数
    public void OnSelectSlot(int position)
    {
        //一旦全てのスロットの選択パネルを非表示にする
        foreach(Slot slot in slots) //slotsの数だけ繰り返す
        {
            slot.HideBgPanel();
        }
        //選択されたスロットの選択パネルを表示する
        if (slots[position].OnSelected()) // もしアイテムの選択が成功したなら
        {
            selectedSlot = slots[position]; //選択しているスロットの番号を変数に入れる
        }
    }


    //アイテムの使用を試みる&使えるなら使ってしまう
    public bool TryUseItem(Item.Type type)
    {
        //選択スロットがあるかどうか
        if(selectedSlot == null)
        {
            return false;
        }

        if(selectedSlot.GetItem().type == type)
        {
            selectedSlot.SetItem(null); // 使ったアイテムを消す
            selectedSlot.HideBgPanel(); // 選択背景画像も消す
            selectedSlot = null;        // 選んでるスロットの保持もなくす
            return true;
        }
        return false;
    }
}

Slotスクリプトのコード

今回編集したSlotのコードは
以下となります。

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

public class Slot : MonoBehaviour
{
    Item item = default;
    [SerializeField] Image image = default;
    [SerializeField] GameObject backgroundPanel = default;

    private void Awake()
    {
        //image = GetComponent<Image>(); //imageにImageコンポーネントを入れる
    }

    private void Start()
    {
        backgroundPanel.SetActive(false);
    }


    //アイテムスロットが空かどうかの判断
    public bool IsEmpty()
    {
        if(item == null)
        {
            return true;
        }
        return false;
    }


    //ItemBoxスクリプトのSetItem関数で実行
    public void SetItem(Item item)
    {
        this.item = item;
        UpdateImage(item);
    }


    //ItemBoxスクリプトのTryUseItem関数で実行
    public Item GetItem()
    {
        return item;
    }


    // アイテムを受け取ったら画像をスロットに表示してやる
    void UpdateImage(Item item)
    {
        if(item == null) //もしアイテムがないなら
        {
            image.sprite = null; //画像を何も入れない
        }
        else
        {
            image.sprite = item.sprite; //Slotのimageにクリックしたアイテムのspriteを入れる
        }
    }


    //選択した時の背景パネルを表示する関数 =>ItemBoxスクリプトのOnSelectSlot関数で使用
    public bool OnSelected()
    {
        if(item == null) // アイテムを持っていない場合
        {
            return false; //選択は失敗
        }

        backgroundPanel.SetActive(true); //背景画像パネルを表示する
        return true; //選択成功
    }


    //選択した時の背景パネルを消す関数 =>ItemBoxスクリプトのOnSelectSlot関数で使用
    public void HideBgPanel()
    {
        backgroundPanel.SetActive(false);
    }
}

アイテムの使用で勉強したことのまとめ

3D脱出ゲームの作り方その7
「アイテムの使用」で勉強した
内容についてのまとめです。

アイテムの使用をする方法は、
 まずアイテム使用するための
 ギミックオブジェクト用意します。

次に、ギミックをクリックした時の
 処理を行うためにC#スクリプトを
 作ってコードを書きます。

さらに、ギミックをクリアする
 ためのアイテムを持っているかを
 判定するコードを書きます。

そして、ギミックをクリアした時に
 使ったアイテムをアイテムボックス
 の中から消す処理を作ります。

今回の内容を実践してPlayボタンで
実行すると、

アイテムを使う画像の初期状態
初期状態
Cubeを選択すると、Selected SlotにSlot0(Slot)が入る。
アイテム使用後の画像
画面上のカプセルをクリックすると消えて、アイテムボックスのCubeがなくなる。
さらにSelected SlotがNoneになり、ログが出る。

以上で「アイテムの使用」の
目標は達成です!

スポンサーリンク

-Unityで3D脱出ゲーム