【unity】3D脱出ゲーム作成_その9

3D脱出ゲーム

アイテムスロット画面作成

前回データベースまで作成しましたが、アイテムと関連づける前に表示画面を準備しなければなりません。PlayerCamera(Main)に追従するPlayerCanvasを設置し、子として任意の大きさで表示パネルを設置します。

次にこの表示パネルの子オブジェクトとしてアイテムスロットを設置しましょう。これにはクリックイベントを付けたいのでButtonにしました。ついでにアイテムスロットの子オブジェクトとしてUITextを設置しアイテムの説明文を表示できるようにします。

アイテムスロットは等間隔で設置したいので表示パネルにGridLayoutGroupというコンポーネントを追加します。GridLayoutGroupでは子の間隔の他にサイズ設定もできるので便利です。

薄白いバーが表示パネル
アイテムスロット強調の為にOutlineコンポーネント追加(任意)

ここまでできたらアイテムスロットはプレハブとして保存(1つでいいです)後、削除しましょう。

アイテムデータベースを活用してアイテム管理

PlayerCanvasに以下アイテム管理用のスクリプトを作成します。

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

public class ItemManager : MonoBehaviour
{
   [SerializeField] ItemDataBase itemDataBase;//その8で作成したデータベース
   [SerializeField] Transform content;//表示パネル
   [SerializeField] GameObject imagePrefab;//プレハブのアイテムスロット
   List<Goods> itemmanager = new List<Goods>();//取得アイテムリスト

   static ItemManager instance;
   public static ItemManager GetInstance()
   {
	return instance;
   }
   private void Awake()//startメソッドとほぼ同じ
   {
     instance = this;
   }
   public bool HasItem(string searchName)//データベース上に存在するか否か
   {
     return itemDataBase.GetItemLists()
            .Exists(item => item.GetItemName() == searchName);
   }
   public Item GetItem(string searchName)//Goodsに取得アイテム情報を渡す
   {
     return itemDataBase.GetItemLists()
            .Find(itemName => itemName.GetItemName() == searchName);
   }
   public void Obtain(Obtainable item)
   {
	if (ItemManager.GetInstance().HasItem(item.GetItemName()))
	{
		GameObject goodsObj = Instantiate(imagePrefab,    
              content);//(child, parent)にプレハブ生成
		Goods goods = goodsObj.GetComponent<Goods>();
		goods.SetUp(item);
		item.GetGameObject().SetActive(false);
		itemmanager.Add(goods);
	}
   }
}

取得するアイテムをクリックすると情報取得→同アイテムがデータベースに設定されている場合アイテムスロットプレハブを生成→情報取得したアイテムの画像やテキスト情報をデータベースからアイテムスロットに渡す→取得アイテムリストを更新し該当アイテムを非表示 という流れになります。

赤と青マーカーはそれぞれ次回作成予定のスクリプトObtainableとGoodsの内容となります。それらのスクリプトで使用する為ItemManagerのインスタンスをstaticしています。

その他

staticについて簡単に触れていますが、他有効利用する場面(シーン遷移)で詳細に触れたいと思います。Startメソッドは先々で追加する場面があったので今回はAwakeメソッドを使用しました。正確にはStartメソッドよりAwakeメソッドが先に呼ばれるらしいです。

コメント

タイトルとURLをコピーしました