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ボタンで
実行すると、
以上で「アイテムの使用」の
目標は達成です!