##アイテムボックスの作成
###UIの作成
UI-Panel
InspectorのAnchor Presetsでアンカーをtop-centerに設定し、
Pivotを1、Pos Yを0、Heightを200にする
Colorを黒にする
名前をItemBoxPnelにする
ItemBoxPnelの下に、UI-Imageを作成し、名前をItemBoxとする
サイズ(W120、H100)
Add CompornentでButtonコンポーネントをつける
ItemBoxをProjectのprefabフォルダにドラッグアンドドロップしてプレハブ化する
コピペ(Ctrl+D)して4つにする
ItemBoxPnelを選択した状態で、Add CompornentでHorizontalLayoutGropにする
ChildForceExpandのチェックマークを外して、ChildAlignmentでMiddleCenterを選択する
Spacingをドラッグしながら間隔を調節する(55くらい)
###アイテムを取得したらアイテムボックスに入れる
ItemBoxManagerスクリプトを作成し、ItemBoxPnelに張り付ける
◇使うアイテムの列挙型(ITEM)をつくる
NONE, (アイテムが何もない)
LIGHT_BULB (電球)
◇アイテムボックスは4つのアイテムを取得できるので、それらを配列で管理する
ITEM[] itemList = new ITEM[4];
取得したアイテムの配列
itemListという配列を宣言して、4つの箱で作成する
※列挙型で作った「ITEM」型の配列
(列挙型と配列の組み合わせ)
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public enum ITEM
{
NONE, //アイテムが何もない
LIGHT_BULB //電球
}
public class ItemBoxManager : MonoBehaviour
{
ITEM[] itemList = new ITEM[4]; // 取得したアイテムの配列
// アイテムを取得
public void SetItem(ITEM item)
{
itemList[0] = item; //0番目の箱にitemを取得する
}
// アイテムの使用
public void UseItem(int index)
{
itemList[index] = ITEM.NONE; // index番目のアイテムを使用したので空にする
}
}
内部的に、SetItem(LIGHT_BULB)で電球を取得し、UseItem(0)で0番目のアイテムを使用する,
という関数が作成されている。
この処理に、画像の表示を追加する
◇画像を取得する
using UnityEngine.UI;
を追加する
※UIオブジェクト(Image型やText型)をスクリプトで使用するときに必要
これまでも、ImageやTextを使用していたのに必要なかった?
・これまではGameObjectを操作していたから、、、Image型やText型を使うときには.UIが必要
itemBoxの画像と、電球の画像を取得する
[SerializeField] Sprite lightBulbSprite; // 電球画像
[SerializeField] Image[] itemBoxImages; //itemBoxIの画像(配列)
Sprite 画像の形式(UIではない)
Sprite型の画像のオブジェクト
(この素材は全部Sprite)
InspecterでItemBoxPnelオブジェクトのItemBoxManagerスクリプトに
lightBulbSprite
itemBoxImages
が出ている
lightBulbSpriteにLightBulbの画像を設定する
itemBoxImagesの▽をクリックしてSizeを4にする
4つのElementにItemBoxの各画像を設定する
◇itemに電球のデータが取得されたら、電球の画像を表示する
itemがNONE、それ以外の場合は何も表示しない
◇index番目のアイテムを使用したら、index番目に何も表示しない
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public enum ITEM
{
NONE,
LIGHT_BULB
}
public class ItemBoxManager : MonoBehaviour
{
[SerializeField] Sprite lightBulbSprite; // 電球画像
[SerializeField] Image[] itemBoxImages;
ITEM[] itemList = new ITEM[4]; // 取得したアイテムの配列
// アイテムを取得
public void SetItem(ITEM item)
{
itemList[0] = item; //0番目の箱にitemを取得する
switch (item)
{
case ITEM.LIGHT_BULB: //電球のデータが取得されたら、電球の画像を表示する
itemBoxImages[0].sprite = lightBulbSprite;
break;
default: //itemがNONE、それ以外の場合は何も表示しない
case ITEM.NONE:
itemBoxImages[0].sprite = null;
break;
}
}
// アイテムの使用
public void UseItem(int index)
{
itemList[index] = ITEM.NONE; // index番目のアイテムを使用したので空にする
itemBoxImages[index].sprite = null; //index番目に何も表示しない
}
◇DrawerPnelで引き出しがクリックされて電球が取得されたときに、上記の処理を実行させる
DrawerManagerスクリプトで
[SerializeField] ItemBoxManager itemBoxManager;
を宣言し、
OnClickTrigger()関数に下記を追加する
itemBoxManager.SetItem(ITEM.LIGHT_BULB);
途中から戻るボタンが使えなくなったのは、
ItemBoxPnelが、戻るボタンを邪魔している。
修正方法、下記のどちらか
1.BackTriggerButtonを、全部のパネルより下に配置する(Hierarchyウィンドウで下(最新)のオブジェクトが上に重なるから。)
2.ItemBoxPanelのRaycast Targetのチェックをはずして、ItemBoxPanelをマウスクリックの対象から外す。
(今回は2.の方法で修正)
##教材
Unityゲームスタジオ スタジオしまづ
【Unity】初心者からの脱出!? 脱出ゲームの作り方 その3
https://youtu.be/S8G9LE0LNq8
【Unity】初心者からの脱出!? 脱出ゲームの作り方 その4 ItemBoxスクリプトの実装
https://youtu.be/LJ8VFcDfJno