見出し画像

【Unity】3Dローグライクゲームの作り方〜Step14-12〜

前回の記事はこちら
前回はアイテム合成スロットにアイテムを入れたりしました。

スロットに入れられるものを制限する

さて、前回はスロットに何でも入れられる状態になっていましたが、これを改善します。
CocktailWindowActionクラスを変更して下さい。

// パラメーターを追記
public int itemNum = 3;
public int stoneNum = 1;

// メソッドを変更
private void SelectItem()
{
   if (KeyConfig.GetKeyDown(KeyConfig.EType.COCKTAILACTION))
   {
       selectItem = mainDisplay.GetSelectItem();
       int selectItemIndex = mainDisplay.GetSelectItemIndex();
       if (selectItemIndex < itemNum)
       {
           playerInventoryAction.OpenInventory(false, cocktailWindow: this);
       }
       else if (selectItemIndex < itemNum + stoneNum)
       {
           playerInventoryAction.OpenInventory(true, cocktailWindow: this);
       }
       action = EAct.Act;
   }
}

itemNum、stoneNumは使用できるアイテムと魔石の最大数をそれぞれ表しています。
実行してみます。

スクリーンショット 2020-11-19 16.46.40

青いスロットを選択すると魔石インベントリが表示され、一番下のスロットは選択できなくなりました。

スロットにアイテムを入れたまま画面を閉じた時

この時はスロットに入っているアイテムを全てインベントリに戻します。
まずInventoryクラスにメソッドを追記して下さい。

/**
* 中身を空っぽにする
*/
public void Clear() => items.Clear();

CocktailWindowActionクラスのメソッドを変更して下さい。

private void MoveBegin()
{
   isOpen = !isOpen;
   if (isOpen)
   {
       // 以下1行を追記
       mainDisplay.Show();
       gameObject.SetActive(true);
   }
   action = EAct.Move;
}

private void MoveEnd()
{
   if (isOpen) action = EAct.ActBegin;
   else
   {
       gameObject.SetActive(false);
       for (int i = 0; i < itemNum + stoneNum; i++)
       {
           Item it = itemInventory.Get(i);
           if (it == null) continue;
           if (i < itemNum) playerInventoryAction.itemInventory.Add(it);
           else playerInventoryAction.stoneInventory.Add(it);
       }
       itemInventory.Clear();
       action = EAct.TurnEnd;
   }
}

実行してみます。スロットにアイテムが入った状態で閉じるとインベントリにアイテムが戻ったと思います。そして再度合成画面を開くとスロットの中身が空になっているはずです。

レシピデータの作成

ここまでできたら、アイテム合成用のレシピデータを作成します。
ExcelItemDataファイルに新しく「CocktailRecipe」シートを作成し、以下のように記述します。

スクリーンショット 2020-11-20 0.16.11

「product」には完成品の、「stone」には魔石の、「item~」には合成するアイテムのIDを記述しましょう。ただし、item~にはID番号の若い順から入力するようにして下さい。
ファイルを取り込む前に、ExcelItemDataクラスに以下のように記述して下さい。

using System.Collections.Generic;
using UnityEngine;

[ExcelAsset]
public class ExcelItemData : ScriptableObject
{
   public List<Item.ItemData> Equipments;
   public List<Item.ItemData> Goods;
   public List<CocktailRecipeData> CocktailRecipe;

   [System.Serializable]
   public class CocktailRecipeData
   {
       public int id;
       public EItem product;
       public EItem stone;
       public EItem item1;
       public EItem item2;
       public EItem item3;
       public bool isFind;
   }
}

ビルドしたら、ExcelItemDataファイルをインポートします。
ちゃんと取り込まれているか確認しておいて下さい。

合成キーを入力すると入れたアイテムが消えるようにする

実際に合成する前にこの処理を書いておきましょう。
まずは合成キーを書いていなかったのでKeyConfigクラスに追記します。

COCKTAILSTART = KeyCode.E,

次にCocktailWindowActionクラスに追記します。

// パラメーターを追記
public int itemNumMin = 2;

// メソッドを追記
/**
* アイテム合成を開始する
*/
private void CocktailItem()
{
   if (KeyConfig.GetKeyDown(KeyConfig.EType.COCKTAILSTART))
   {
       for (int i = itemNum; i < stoneNum; i++)
       {
           if (itemInventory.Get(i) == null) return;
       }
       int num = 0;
       for (int i = 0; i < itemNum; i++)
       {
           if (itemInventory.Get(i) == null) continue;
           num++;
       }
       if (num < itemNumMin) return;
       itemInventory.Clear();
       mainDisplay.Show();
   }
}

// メソッドを変更
private void ActBegin()
{
   if (selectItem == null)
   {
       bool isCursorMoving = !MoveSelectItem();
       if (isCursorMoving) return;
       KeyInput(false);
       SelectItem();
       CocktailItem();
   }
   else
   {
       UnSelectItem();
   }
}

実行してみます。
アイテムが2個以上と魔石が入っている時にEキーを押すと合成開始(=アイテムがなくなる)します。

という訳で短いですが今回はここまでです。
次回は実際にアイテムを合成できるようにしたいと思います。

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