Unityで3D脱出ゲーム

Unity 3D脱出ゲームの作り方その26:使うアイテムを選ぶ処理の作成

2021年1月23日

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

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

3D脱出ゲームの作り方

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

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

使いたいアイテムを選ぶ方法と使ったアイテムを消す方法

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

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

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

このページでお伝えしている内容は、
動画の39:26あたりからの内容になります。

Udemyで学習している場合は、90からとなります。

スポンサーリンク

この動画で勉強すること

▶︎使いたいアイテムを選ぶ方法と使ったアイテムを消す方法について学ぶ。

目標1

アイテムボックスの黒枠を消す。

=>Slotスクリプトの編集をする。(BackPanelを取得)

=>SlotプレファブでBckPanelを設定する。

目標2

選んだスロットに黒枠がつくようにする。

=>Slotプレファブの子要素imageにButtonをつける。

=>ItemBoxスクリプトにコードを書く。(OnSlotClick関数の作成)

=>Slotスクリプトにコードを書く。(OnSelect関数の作成)

=>UnityエディタでSlotのButton設定を行う。

目標3

選んだスロット以外には黒枠が付かないようにする。

=>ItemBoxスクリプトの編集する。(一旦全ての黒枠を消す処理の作成)

=>Slotスクリプトにコードを書く(HideBackPanel関数の作成)

目標4

スロットにアイテムがある場合にだけ黒枠がつくようにする。

=>ItemBoxスクリプトの編集(スロットにアイテムがなかった場合の処理を作成)

目標4

アイテムを選んでいる時に宝箱をクリックすると開くようにする。

=>Slotスクリプトにコードを書く(GetItem関数の作成)

=>ItemBoxスクリプトにコードを書く(選択アイテムを取得する処理の作成)

=>ItemBoxスクリプトにコードを書く(鍵が選択されているかどうかを判定する関数の作成)

=>Chestスクリプトのコードを編集する(鍵の判定をする処理を書く)

目標5

アイテム選択の汎用性をあげるための修正を行う。

=>ItemBoxスクリプトのCheckSelectItem関数に引数を入れる。

=>Chestスクリプトのコードも編集する。(引数を入れる)

目標6

エラーの修正を行う。

=>ItemBoxスクリプトの編集をする。(nullの場合の処理を作る)

目標7

使ったアイテムを消す処理の作成とコード修正をする。

=>ItemBoxスクリプトにコードを書く。(UseSelectItem関数の作成)

=>ItemBoxスクリプトの「アイテム選択のコード」を「スロットを選択するコード」に修正する。

=>エラーが出ているコードを修正する。

=>Slotスクリプトにコードを書く(RemoveItem関数の作成)

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

Slotスクリプトのコード

使うアイテムを選ぶ処理を作るために
編集したSlotスクリプトのコードは
以下となります。

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

public class Slot : MonoBehaviour
{
    [SerializeField] GameObject backPanel = default; //選択パネル
    [SerializeField] Image image = default;

    Item item = null;

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


    // Slotにアイテム画像を表示する
    public void Set(Item item)
    {
        this.item = item;
        image.sprite = item.sprite;
    }

    public void RemoveItem()
    {
        item = null;
        image.sprite = null;
        HideBackPanel();
    }

    public Item GetItem()
    {
        return item;
    }

    // アイテムが空かのチェック
    public bool IsEmpty()
    {
        if(item == null)
        {
            return true;
        }
        return false;
    }

    public void OnSelect()
    {
        backPanel.SetActive(true);
    }

    public void HideBackPanel()
    {
        backPanel.SetActive(false);
    }
}

ItemBoxスクリプトのコード

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

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

public class ItemBox : MonoBehaviour
{
    // ItemBoxが全てのSlotを把握
    [SerializeField] Slot[] slots = default;

    //どこからでも利用できる変数
    public static ItemBox instance;

    // アイテム選択を作る // 選択アイテム:NG =>選択スロット
    Slot selectSlot;

    private void Awake()
    {
        //自分を入れる
        instance = this;
    }


    // クリックしたらItemを受け取る
    public void SetItem(Item item)
    {
        // TODO:左詰めで入れる=左から空いてるSlotがあれば入れる
        for(int i=0; i<slots.Length; i++)
        {
            Slot slot = slots[i];
            if (slot.IsEmpty())
            {
                slot.Set(item);
                break;
            }
        }
    }

    // スロットをクリックした時
    public void OnSlotClick(int position)
    {
        // 選択したところにアイテムがなかったら、何もしない
        if (slots[position].IsEmpty())
        {
            return; //関数の実行をここで終了する
        }

        // 一度全て白にする
        for(int i=0; i<slots.Length; i++)
        {
            //slots[i]の背景をなくす
            slots[i].HideBackPanel();
        }
        // クリックしたスロットの背景を黒にする
        slots[position].OnSelect();
        // 選択アイテムとして、取得する
        selectSlot = slots[position];
    }

    // 鍵を選択しているかどうかを判定する関数
    public bool CheckSelectItem(Item.Type useItemType)
    {
        if(selectSlot == null)
        {
            return false;
        }

        if(selectSlot.GetItem().type == useItemType)
        {
            return true;
        }
        return false;
    }

    public void UseSelectItem()
    {
        selectSlot.RemoveItem();
        selectSlot = null;
    }
}

Chestスクリプトのコード

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

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

public class Chest : MonoBehaviour
{
    // クリックされたら
    // 鍵を持っていると:鍵を取得して選択状態なら
    // 開ける=アニメーション
    [SerializeField] Animation anim = default;

    public void Open()
    {
        // keyアイテムを選択していたら
        if (ItemBox.instance.CheckSelectItem(Item.Type.Key))
        {
            ItemBox.instance.UseSelectItem();
            anim.Play();
        }
    }
}

使うアイテムを選ぶ処理の作成で勉強したことのまとめ

3D脱出ゲームの作り方その26
「使うアイテムを選ぶ処理の作成」
で勉強した内容についてのまとめです。

使うアイテムを選ぶには、
 まずアイテムボックスの
 黒枠を消します。

そして次に選んだスロットに
 黒枠がつくようにして、その後
 選んだスロット以外に黒枠が
 付かないように修正をします。

その次はアイテムがある場合に
 だけ選んだ時の黒枠が表示が
 されるように修正を行います。

 これで使うアイテムを選ぶことが
 できるようになります。

そして次に特定のアイテムを
 選んだ時にだけ、ギミックが
 反応する処理の実装を行います。
(今回は鍵を選んでいる時にのみ、宝箱が開く)

アイテムの使用ができるように
 なったら、そのコードについて
 汎用性をあげるための修正を行います。

さらにズームカメラからメインの
 カメラへ戻るBackButtonの設定を
 行い、コードを書いて戻る処理を作成します。

そして、選んだアイテムを
 使った時に消す処理を作成することで、

 使うアイテムを選ぶ処理と
 アイテムを使う処理の作成が
 完了となります。

以上の作業を行なった後に、

入手した鍵を選択してから
宝箱の鍵マークパネルを
クリックすると宝箱が開き、
使った鍵が消えるようになります。

使うアイテムの鍵を選択している画像
アイテムの鍵を使って宝箱が開いた画像

「使うアイテムを選ぶ処理の作成」
の目標は以上で達成です!

スポンサーリンク

-Unityで3D脱出ゲーム