見出し画像

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

前回の記事はこちら
前回はアイテム合成レシピを作成したりしました。

正しいアイテムを合成した時アイテムを入手する

それでは前回の続きから行っていきます。
まずInventoryクラスの以下のメソッドを変更します。

public void Sort()
{
   System.Comparison<Item> s = (a, b) =>
   {
       int i = isSort ? -1 : 1;
       if (b == null) return -1;
       if (a == null) return 1;
       if (!a.isEquip && b.isEquip) return i;
       if (a.isEquip && !b.isEquip) return -i;
       if (a.id == b.id) return (a.extPoint - b.extPoint) * i;
       return (a.id - b.id) * i;
   };
   items.Sort(s);
   isSort = !isSort;
}

public void Sort(EItemType type)
{
   System.Comparison<Item> s = (a, b) =>
   {
       if (b == null) return -1;
       if (a == null) return 1;
       if (a.id == b.id) return a.extPoint - b.extPoint;
       if (a.type != b.type)
       {
           if (a.type == type) return -1;
           if (b.type == type) return 1;
       }
       return a.id - b.id;
   };
   items.Sort(s);
   isSort = !isSort;
}

CocktailWindowActionクラスを変更して下さい。

// パラメーターを追加
public ExcelItemData database;

// メソッドを追加
/**
* アイテム合成をする
*/
private void CocktailItem(Item[] items)
{
   Message.Add(45);
   ExcelItemData.CocktailRecipeData recipe = database.CocktailRecipe.Find(
       n => n.stone == items[0].id && n.item1 == items[1].id &&
       n.item2 == items[2].id && n.item3 == items[3].id);
   if (recipe == null)
   {
       Message.Add(47);
       return;
   }
   Item it = null;
   if ((int)recipe.product > 1000) it = database.Goods.Find(n => n.id == recipe.product).Get();
   else it = database.Equipments.Find(n => n.id == recipe.product).Get();
   if (it == null)
   {
       Message.Add(47);
       return;
   }
   playerInventoryAction.itemInventory.Add(it);
   Message.Add(46, it.name);
}

// メソッドを変更
private void CocktailItem()
{
   if (KeyConfig.GetKeyDown(KeyConfig.EType.COCKTAILSTART))
   {
       for (int i = itemNum; i < stoneNum; i++)
       {
           if (itemInventory.Get(i) == null)
           {
               Message.Add(48);
               return;
           }
       }
       int num = 0;
       for (int i = 0; i < itemNum; i++)
       {
           if (itemInventory.Get(i) == null) continue;
           num++;
       }
       if (num < itemNumMin)
       {
           Message.Add(48);
           return;
       }
       Item[] items = new Item[itemNum + stoneNum];
       for (int i = 0; i < stoneNum; i++)
       {
           Item it = itemInventory.Get(itemNum + i);
           items[i] = it;
           itemInventory.Remove(it);
       }
       itemInventory.Sort();
       for (int i = stoneNum; i < itemNum + stoneNum; i++)
       {
           Item it = itemInventory.Get(i - stoneNum);
           if (it == null) items[i] = new Item.ItemData().Get();
           else items[i] = it;
       }
       CocktailItem(items);
       itemInventory.Clear();
       mainDisplay.Show();
   }
}

今回追加したメッセージは以下の通りです。

スクリーンショット 2020-11-21 22.49.16

ビルドして、確かめてみます。

スクリーンショット 2020-11-22 0.00.57

これで合成すると......。

スクリーンショット 2020-11-22 0.01.36

初級ポーションになりました。なお、ちゃんとインベントリに初級ポーションが入っているかも確認しておきましょう。

レシピを登録する

合成に成功したレシピを登録します。登録場所を作成し、そこにレシピのIDに対応するbool値を格納することにします。
CocktailWindowActionクラスを変更して下さい。

// パラメーターを追加
public bool[] findRecipe { get { return recipe; } set { recipe = value; } }
private bool[] recipe;

// メソッドを追加
private void Start()
{
   if (recipe == null)
       recipe = new bool[database.CocktailRecipe.Count];
}

// メソッドを変更
private void CocktailItem(Item[] items)
{
   /*   省略   */
   playerInventoryAction.itemInventory.Add(it);
   // 以下1行を追記
   this.recipe[recipe.id - 1] = true;
   Message.Add(46, it.name);
}

実行しても画面上に変化はありません。確認するにはメニューの表示機能を付けないといけませんね。
ですがそれは次回に回して、今回はここまでにします。
(投稿しないよりはいいと判断しました。短くてすみません!)
次回、合成メニューの表示から行いたいと思います。

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