見出し画像

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

前回の記事はこちら
前回は+付きアイテムを実装しました。

装備品の種類の追加

それでは今回は装備品の種類を増やしてみたいと思います。
増やすのはアクセサリー(1枠のみ)になります。
まずEItemとEItemTypeに追記します。

// EItemに追記
ACCESSORY01 = 21,

// EItemTypeに追記
Accessory,

プレハブも用意しておきましょう。
使用するスプライトをフォルダに入れ、Item1から新しいプレハブを作成し、名前とスプライトの項目を再設定します。名前は任意ですが、筆者は「Item7」にしました。
詳しくはStep11-7の「プレハブの用意」を参考にして下さい。

XLSXファイルに追記

まずはExcelItemDataファイルに追記します。

スクリーンショット 2020-10-23 3.42.42

装備品の方にもextraの列を増やしました。
次にExcelAppearDataファイルにも追記します。

スクリーンショット 2020-10-23 2.06.46

アクセサリーという種類を増やしたので、ItemPlusMaxシートにも追記します。

スクリーンショット 2020-10-23 2.09.14

追記し終わったら、ファイルを置き換えることを忘れずに行って下さい。

装備品の枠の拡張

ここからが本題です。ActorParamsControllerクラスを以下のように変更して下さい。

// 内部クラスのEquipmentを以下のように変更
[System.Serializable]
public class Equipment
{
   public Item weapon;
   public Item armor;
   public Item accessory;

   public int GetAllAtk()
   {
       return (weapon == null ? 0 : weapon.atk) + (armor == null ? 0 : armor.atk) + (accessory == null ? 0 : accessory.atk);
   }

   public int GetAllDef()
   {
       return (weapon == null ? 0 : weapon.def) + (armor == null ? 0 : armor.def) + (accessory == null ? 0 : accessory.def);
   }
}

// メソッドを変更
public void EquipItem(Item it)
{
   RemoveEquipment(it);
   if (it.type == EItemType.Weapon)
   {
       /*   省略   */
   }
   else if (it.type == EItemType.Armor)
   {
       /*   省略   */
   }
   else if (it.type == EItemType.Accessory)
   {
       Message.Add(6, it.name);
       equipment.accessory = it;
       it.isEquip = true;
   }
}

public void RemoveEquipment(Item it)
{
   if (it.type == EItemType.Weapon && equipment.weapon != null && equipment.weapon.isEquip)
   {
       /*   省略   */
   }
   else if (it.type == EItemType.Armor && equipment.armor != null && equipment.armor.isEquip)
   {
       /*   省略   */
   }
   else if (it.type == EItemType.Accessory && equipment.accessory != null && equipment.accessory.isEquip)
   {
       Message.Add(7, equipment.accessory.name);
       equipment.accessory.isEquip = false;
       equipment.accessory = null;
   }
}

装備するだけならこれで構いませんが、セーブ&ロードした時に反映されないと思います。反映させるにはInventoryクラスも変える必要があります。

public void SetAllItem(Item[] itemList, int maxNum)
{
   List<Item> items = new List<Item>();
   ActorParamsController.Equipment equipment = new ActorParamsController.Equipment();
   int itemCnt = itemList.Length < maxNum ? itemList.Length : maxNum;
   for (int i = 0; i < itemCnt; i++)
   {
       items.Add(itemList[i].Get());
       if (items[i].isEquip)
       {
           /*   省略   */
           // 以下5行を追記
           if (items[i].type == EItemType.Accessory)
           {
               if (equipment.accessory == null) equipment.accessory = items[i];
               else items[i].isEquip = false;
           }
       }
   }
   itemNumMax = maxNum;
   this.items = items;
   GetComponent<ActorParamsController>().equipment = equipment;
}

実行してみます。ちゃんと装備できますか? 右上のステータスはちゃんと反映されていますか? セーブ&ロードの時の処理も確認しておきましょう。

スクリーンショット 2020-10-23 3.33.05

通常であれば装備品の枠を増やす場合はここまで行えば大丈夫です。

Protect機能の実装

しかし新しく追加したアイテムには特殊な機能が付いています。という訳で最後にProtect機能を実装しようと思います。
死にそうな時に効果がある機能ですので、ActorParamsControllerクラスのDeathJudgementメソッドに追記すれば良さそうに思われるかもしれませんが、HPは残しておきたいのでダメージを受けるDamagedメソッドで判定を行います。

// ActorParamsControllerクラスにメソッドを追加
/*
* 身が守られるかどうか
*/
private bool Protect(float damage)
{
   if ((parameter.hp - damage) <= 0)
   {
       if (equipment.accessory.extra.Contains("Protect"))
       {
           Message.Add(14, equipment.accessory.name);
           GetComponent<Inventory>().Remove(equipment.accessory);
           equipment.accessory = null;
           return true;
       }
   }
   return false;
}

// メソッドに追記
public void Damaged(float str, out int xp)
{
   float d = CalcDamage(str, parameter.def + equipment.GetAllDef());
   if (!Protect(d)) parameter.hp -= d; // ここ
   if (parameter.id == EActor.PLAYER) Message.Add(1, actorName, d.ToString());
   else Message.Add(2, actorName, d.ToString());
   xp = 0;
   if (DeathJudgment()) xp = parameter.xp;
   else ClearCondition(ECondition.Sleep);
}

実行してみます。

スクリーンショット 2020-10-23 4.27.07

体力が0になりそうになったら、アイテムがなくなりました。代わりにプレイヤーはギリギリ生き残っています!

というところで今回はここまでにします。
次回は敵キャラクターを倒したらアイテムがドロップするようにしたいです。

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