![見出し画像](https://assets.st-note.com/production/uploads/images/25988930/rectangle_large_type_2_bdb4dc249846c3fd7f4d74381e9b7e9e.png?width=1200)
【Unity】3Dローグライクゲームの作り方〜Step9&10-13〜
前回の記事はこちら。
前回はアイテムのデータファイルを作成しました。
ItemとItemParamsControllerスクリプトの修正
まず最初に、Itemスクリプトから変更していきます。以下のパラメーターを追加、変更して下さい。
// 以下のパラメーターの型を変更
public EItem id;
// 以下を追加
public EItemType type;
public int atk;
public int def;
public int hp;
public int food;
public int dmg;
public string detail;
それができたら、ItemParamsControllerスクリプトのSetParamsメソッドを以下のように変更しましょう。
public void SetParams(Item it)
{
/* 省略 */
p.sprite = it.sprite;
// 以下7行を追加
p.type = it.type;
p.atk = it.atk;
p.def = it.def;
p.hp = it.hp;
p.food = it.food;
p.dmg = it.dmg;
p.detail = it.detail;
parameter = p;
}
ExcelItemDataスクリプトの修正
ExcelItemDataスクリプトのコメント文を削除して、以下のパラメーターを追加して下さい。
public List<Item> Equipments;
public List<Item> Goods;
ビルドして、アイテムデータのXLSXファイルを再インポートしたら、データが反映されているか確認しておきましょう。
(オプション)インベントリにアイテムを追加する
データを読み込めたところで、インスペクター上のインベントリでアイテムIDを選択したら、そのアイテムが自動で追加されるようにします。
これはエディター拡張で実現できます。早速やっていきましょう。
まず、Assets/Editorフォルダの中に「InventoryEditor」スクリプトを作成します(Editorフォルダを作成していない方は作成しましょう)。そして、中身を以下のように書き換えます。
using UnityEngine;
using UnityEditor;
using UnityEditorInternal;
[CustomEditor(typeof(Inventory))]
[CanEditMultipleObjects]
public class InventoryEditor : Editor
{
private ReorderableList list;
private Inventory inventory;
private EItem id;
void OnEnable()
{
inventory = (Inventory)target;
list = new ReorderableList(
inventory.items,
typeof(Item)
);
list.drawElementCallback += DrawElement;
list.onCanAddCallback += CanAdd;
list.drawHeaderCallback += DrawHeader;
}
public override void OnInspectorGUI()
{
serializedObject.Update();
inventory.itemNumMax = Mathf.Max(0, EditorGUILayout.IntField("所持可能数", inventory.itemNumMax));
list.DoLayoutList();
id = (EItem)EditorGUILayout.EnumPopup("アイテムID", id);
serializedObject.ApplyModifiedProperties();
}
private void DrawElement(Rect rect, int index, bool isActive, bool isFocused)
{
if (isFocused)
{
ExcelItemData database = Resources.Load<ExcelItemData>("Datas/ExcelItemData");
Item item;
if ((int)id > 1000) item = database.Goods.Find(n => n.id == id);
else item = database.Equipments.Find(n => n.id == id);
if (item != null)
{
SetItem(item, ref item);
inventory.items[index] = item;
}
}
EditorGUI.LabelField(rect, inventory.items[index].name);
}
private bool CanAdd(ReorderableList list)
{
return inventory.items.Count < inventory.itemNumMax;
}
private void DrawHeader(Rect rect)
{
EditorGUI.LabelField(rect, "所持アイテム");
}
private void SetItem(Item it, ref Item parameter)
{
Item p = new Item();
p.id = it.id;
p.type = it.type;
p.name = it.name;
p.prefab = it.prefab;
p.sprite = it.sprite;
p.atk = it.atk;
p.def = it.def;
p.hp = it.hp;
p.food = it.food;
p.dmg = it.dmg;
p.detail = it.detail;
parameter = p;
}
}
所持可能数パラメーターに入れた値分だけ、所持アイテムを増やすことができ、「+」ボタンを押すと空のアイテムを持たせることができます。
アイテムの中身を変えたいときは、下のアイテムIDを変えるアイテムのものに変更し、変更するリスト内の所持アイテムをクリックするだけです。
おまけ:グリッドの値を変更しても位置が変わらない
代わりにNew Gridの値を変更しましょう。
(newGridパラメーターにgridパラメーターをそのまま代入しているのが原因だと思います。気になる方はnewGridパラメーターとgridパラメーターの宣言する順番を変えてあげるといいんじゃないでしょうか)
という訳で、内容は薄いですが今回はここまでということに致します。
次回はマップデータとセーブデータ回になると思います。
この記事が気に入ったらサポートをしてみませんか?