見出し画像

【Unity】3Dローグライクゲームの作り方〜Step9&10-16〜

前回の記事はこちら
前回はアイテムの詳細表示をし、装備アイテムを装備できるようにしました。

アイテムスロットにEマークを付与

それでは前回の続きからやっていきましょうか。
ゲーム中でも装備中かどうかをわかりやすくするために、装備しているアイテムには「E」マークを表示したいと思います。
その為に、プレハブのItemSlotにテキストを追加し、このように設定して下さい。

スクリーンショット 2020-05-18 14.39.53

色はお任せします。
位置調整が終わったら、このEquipFlagは非アクティブにしておきましょう。
スクリプトを書いていきます。ItemSlotDisplayクラスのShowItemInfoメソッドを以下のように変更して下さい。

private void ShowItemInfo()
{
   for (int i = 0; i < maxShowItemNum; i++)
   {
       Transform slot = content.transform.GetChild(i);
       slot.gameObject.SetActive(true);
       int idx = i + leadShowItemIndex;
       Item it = idx == inventory.itemNumMax ? footItem : inventory.Get(idx);
       if (it == null)
       {
           slot.GetComponentInChildren<Text>().text = "";
           slot.GetChild(0).gameObject.SetActive(false);
           slot.GetChild(3).gameObject.SetActive(false);
       }
       else
       {
           slot.GetComponentInChildren<Text>().text = it.name;
           slot.GetChild(0).gameObject.SetActive(true);
           slot.GetComponentsInChildren<Image>()[1].sprite = Resources.Load<Sprite>("Sprites/" + it.sprite);
           if (it.isEquip) slot.GetChild(3).gameObject.SetActive(true);
           else slot.GetChild(3).gameObject.SetActive(false);
       }
   }
}

テストしてみます。装備アイテムなら何でもいいので何かを装備して下さい。その状態で再度インベントリを開くとEマークが表示されたはずです。

スクリーンショット 2020-05-18 14.54.00

複数装備アイテムを持って、武器と防具(カテゴリーが違うもの同士)が同時に装備できるか、装備を付け替えたりしたらどうなるかも確認しておくと良いでしょう。

サブメニューに「外す」項目の追加

装備できたなら、次はその装備を外す項目をサブメニューに追加します。
ついでに、装備中はそのアイテムを投げたり置いたりすることはできないようにしようと思います。
InventoryActionスクリプトを開いて下さい。SelectItemメソッドをこのように変更します。

private void SelectItem()
{
   if (Input.anyKeyDown && Input.GetKeyDown(KeyCode.Space))
   {
       /*    省略    */
       selectItem = display.GetSelectItem();
       if (selectItem != null)
       {
           if (selectItem.isEquip) choiceOrder = "Remove";
           else
           {
               if (display.inventory.GetFootItem() == null) choiceOrder = "Use, Put, Throw";
               else choiceOrder = "Use, Replace, Throw";
               if ((int)selectItem.id < 1001) choiceOrder = choiceOrder.Replace("Use", "Equip");
           }
           subMenu.SetChoices(choiceOrder);
           subMenu.Show();
       }
   }
}

それができたら、今度はActorUseItemsスクリプトを次のように変更します。

// メソッドを追加
/**
* 引数で渡された装備中のアイテムを外す
*/
public bool Remove(Item it)
{
   param.RemoveEquipment(it);
   return true;
}

// GetDelegateメソッドのswitch文内に追記
case "Remove": return new UseItem(Remove);

以上になります。後はSubMenuのChoice NamesとChoice Methodsの要素8にそれぞれ「外す」、「Remove」を設定しておくだけです。
早速テストプレイしてみましょう。アイテムを装備した状態でそのアイテムのサブメニューから外すを選択します。そうしたらEマークが外れるはずです。

スクリーンショット 2020-05-18 16.07.19

装備中のアイテムのサブメニューは「外す」のみ

スクリーンショット 2020-05-18 16.07.40

「外す」を選択するとEマークが外れた

装備アイテムの効果をステータスに反映する

最後に装備アイテムの効果を上乗せして、ダメージを算出したいと思います。
最初に内部クラスのActorParamsController.Equipmentにメソッドを追加します。

/**
* 全ての身につけている装備品の攻撃力の合算値を返す
*/
public int GetAllAtk()
{
   return (weapon == null ? 0 : weapon.atk) + (armor == null ? 0 : armor.atk);
}

/**
* 全ての身につけている装備品の防御力の合算値を返す
*/
public int GetAllDef()
{
   return (weapon == null ? 0 : weapon.def) + (armor == null ? 0 : armor.def);
}

次にActorParamsControllerクラスのDamagedメソッドをこのように変更して下さい。

public void Damaged(int str)
{
   int d = CalcDamage(str, parameter.def + equipment.GetAllDef());
   parameter.hp -= d;
   /*    省略    */
}

最後にActorAttackクラスのDamageOpponentメソッドを変更します。

public void DamageOpponent(GameObject actor)
{
   /*      省略      */
   actor.GetComponent<ActorMovement>().SetDirection(d);
   ActorParamsController param = GetComponent<ActorParamsController>();
   int str = param.parameter.str + param.equipment.GetAllAtk();
   actor.GetComponent<ActorParamsController>().Damaged(str);
}

それではテストしてみましょう。アイテムを装備するとダメージ量が変化したはずです。

スクリーンショット 2020-05-18 17.09.27

通常時

スクリーンショット 2020-05-18 17.10.47

アイテムを装備している時

という訳で、今回は以上になります。
次回は消費アイテムのHP回復効果を実装したいと思います。

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