![見出し画像](https://assets.st-note.com/production/uploads/images/39278449/rectangle_large_type_2_f4cce39f8be7160f14c55254e893d881.png?width=1200)
【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();
}
}
今回追加したメッセージは以下の通りです。
ビルドして、確かめてみます。
これで合成すると......。
初級ポーションになりました。なお、ちゃんとインベントリに初級ポーションが入っているかも確認しておきましょう。
レシピを登録する
合成に成功したレシピを登録します。登録場所を作成し、そこにレシピの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);
}
実行しても画面上に変化はありません。確認するにはメニューの表示機能を付けないといけませんね。
ですがそれは次回に回して、今回はここまでにします。
(投稿しないよりはいいと判断しました。短くてすみません!)
次回、合成メニューの表示から行いたいと思います。
この記事が気に入ったらサポートをしてみませんか?