見出し画像

【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を変えるアイテムのものに変更し、変更するリスト内の所持アイテムをクリックするだけです。

スクリーンショット 2020-05-17 22.46.57

おまけ:グリッドの値を変更しても位置が変わらない

代わりにNew Gridの値を変更しましょう。
(newGridパラメーターにgridパラメーターをそのまま代入しているのが原因だと思います。気になる方はnewGridパラメーターとgridパラメーターの宣言する順番を変えてあげるといいんじゃないでしょうか)

という訳で、内容は薄いですが今回はここまでということに致します。
次回はマップデータとセーブデータ回になると思います。

この記事が気に入ったらサポートをしてみませんか?