前回はプレイヤーキャラクターを作成しました。
ステージ上の環境構築が終わったため今回からはバックエンド側でアイテムの実装をします。
設計
アイテム管理を設計しますが、管理項目が3つあります。
- アイテムデータベース
- プレイヤーが所持しているアイテム
- アイテムポーチ
1. アイテムデータベース
ゲームに存在する全アイテムのデータを管理します。
これがないとアイテムという概念も消えてしまうため必須です。
2. プレイヤーが所持しているアイテム
プレイヤーが何のアイテムを所持しているか管理します。
アイテムデータベースに「プレイヤーの所持数」を設定すれば管理できそうです。
3. アイテムポーチ
1と2があればアイテム管理自体はできるのですがプレイヤーが何も見えてない状態です。
アイテムポーチを作成して所持しているアイテムを画面上で確認できるようにします。
図にするとこんな感じです。

思ったより項目が多いのでこの記事では「アイテムデータベース」と「プレイヤーの所持アイテム」を実装します。
アイテムポーチは次回やります。
実装
アイテムデータベースに関しては以下のプログラムを使用しました。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[CreateAssetMenu(fileName = "ItemDataBase", menuName="CreateItemDataBase")]
/* アイテムデータベース */
public class ItemDataBase : ScriptableObject {
[SerializeField]
private List<Item> itemLists = new List<Item>();
// アイテムリストを返す
public List<Item> GetItemLists()
{
return itemLists;
}
}
参考サイト
リスト型のデータベースを作成してそこにアイテムデータを追加しています。

プレイヤーの所持アイテムに関しては以下のプログラムを使用しました。
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System;
/* アイテムを管理するクラス */
public class ItemManager : MonoBehaviour {
// アイテムデータベース
[SerializeField]
public ItemDataBase itemDataBase;
// アイテムスロット
public GameObject Slot1;
public GameObject Slot2;
public GameObject Slot3;
public GameObject Slot4;
// 各アイテムの所持数
private List<string> i_name;
private List<int> i_num;
// その他、関数内で使用する変数
private int l_size;
private int item_kind;
private int full_slot;
private int slot_num = 4;
void Start()
{
}
// アイテムを拾ったときの処理
public int ItemPick(string pick_name)
{
i_name = new List<string>();
i_num = new List<int>();
l_size = itemDataBase.GetItemLists().Count;
item_kind = 0;
full_slot = 0;
for(int i = 0; i < l_size; i++)
{
i_name.Add(itemDataBase.GetItemLists()[i].GetItemName());
i_num.Add(itemDataBase.GetItemLists()[i].GetItemNum());
// 所持しているアイテムの種類に1加算する
if(0 < i_num[i])
item_kind ++;
}
// スロットが全て埋まっていて、同じアイテムを所持していない場合は何もしない
if( (item_kind == slot_num) && (ItemSearch(pick_name, i_name, i_num, l_size) == 0) )
return 0;
// 拾ったアイテムのアイテム数に1加算する
ItemPlus(pick_name, i_num);
i_num[GetItemID(pick_name)] += 1;
// 拾ったアイテムをアイテムポーチに反映する処理
for(int i = 0; i < l_size; i++)
{
if(slot_num == full_slot)
break;
// アイテムを所持している場合はアイテムを格納する
if(0 < i_num[i])
PushSlot(full_slot++, i_name[i]);
}
// アイテムが格納されてないスロットを空スロットにする処理
while(full_slot < slot_num)
NullSlot(full_slot++);
return 1;
}
// 同じアイテムを所持しているか判断する処理
public int ItemSearch(string pick_name, List<string> i_name, List<int> i_num, int l_size)
{
for(int i = 0; i < l_size; i++)
{
if(pick_name == i_name[i])
{
// 同じアイテムを所持していない場合
if(i_num[i] == 0)
return 0;
// 同じアイテムを既に所持している場合
else
return 1;
}
}
return 0;
}
// アイテムを格納するスロットを選択
public void PushSlot(int full_slot, string i_name)
{
switch(full_slot)
{
case 0:
Slot1.GetComponent<SlotProcess>().SetItem(i_name);
break;
case 1:
Slot2.GetComponent<SlotProcess2>().SetItem(i_name);
break;
case 2:
Slot3.GetComponent<SlotProcess3>().SetItem(i_name);
break;
case 3:
Slot4.GetComponent<SlotProcess4>().SetItem(i_name);
break;
default:
Slot1.GetComponent<SlotProcess>().SetItem(i_name);
break;
}
}
// アイテムを格納しないスロットは空スロットにする
public void NullSlot(int balance_slot)
{
switch(balance_slot)
{
case 0:
Slot1.GetComponent<SlotProcess>().RemoveSlot();
break;
case 1:
Slot2.GetComponent<SlotProcess2>().RemoveSlot();
break;
case 2:
Slot3.GetComponent<SlotProcess3>().RemoveSlot();
break;
case 3:
Slot4.GetComponent<SlotProcess4>().RemoveSlot();
break;
default:
Slot1.GetComponent<SlotProcess>().RemoveSlot();
break;
}
}
// 拾ったアイテムのアイテム数を加算する処理
public void ItemPlus(string i_name, List<int> i_num)
{
int index = GetItemID(i_name);
itemDataBase.GetItemLists()[index].SetItemNum(i_num[index]+1);
}
// アイテム名からアイテムIDを検索
public int GetItemID(string i_name)
{
switch(i_name)
{
case "Apple":
return 0;
case "Coconut":
return 1;
case "Cherry":
return 2;
case "Kiwi":
return 3;
case "Lemon":
return 4;
case "Pear":
return 5;
case "Strawberry":
return 6;
default:
return 0;
}
}
}
参考サイト
アイテムデータの要素に「Item Num」を定義して、アイテムデータベースから直接参照できるようにしています。

アイテムデータベースを作成できたので今回はここまでにします。
次回はアイテムポーチを実装します。