見出し画像

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

前回の記事はこちら
前回は装備アイテムがぶつかったときの処理を書き、杖と魔法の玉のデータを作成しました。

杖の実装

前回の続きから行っていきます。まずは杖を使うと魔法の玉が発射されるようにしたいと思います。
ActorUseItemsスクリプトを開いて下さい。

// メソッドを追加
/**
* 発射する
*/
private bool Shot(Item it)
{
   if (usingItem == null)
   {
       Message.Add(21, param.actorName, it.name);
       ExcelItemData database = Resources.Load<ExcelItemData>("Datas/ExcelItemData");
       Item item = database.Goods.Find(n => n.id == it.shot).Get();
       return Throw(item);
   }
   return Throw(null);
}

// メソッドを修正
private bool UseEffect(Item it)
{
   /*    省略    */
   switch (it.type)
   {
       /*    省略    */
       case EItemType.Wand:
           return Shot(it);
   }
   /*    省略    */
}

投げる処理を使い回して玉を発射させています。
テストしてみましょう。画像の通りになればOKです。

杖1

杖2

杖のコードの修正その1

さて、画像をご覧頂ければ分かる通り、このままだと問題がいくつかあります。これからその修正を行っていきましょう。
問題の一つ目が玉を投げるといったメッセージが表示されてしまうこと。
二つ目が壁に当たったときそのまま玉が残り、拾えてしまうこと。
まずこの二つを修正していきます。
という訳でItemMovementスクリプトを開いて、HitActorメソッドを修正して下さい。

private void HitActor(ActorParamsController tParam, GameObject actor)
{
   Item param = GetComponent<ItemParamsController>().parameter;
   if (actor == null)
   {
       if (param.type == EItemType.Magic) Destroy(gameObject);
       else Message.Add(15, param.name);
   }
   else
   {
       if (param.dmg > 0)
       {
           /*   省略   */
           if ((int)param.id > 1000)
           {
               if (param.type != EItemType.Magic) Message.Add(14, param.name);
               Destroy(gameObject);
           }
           else actor.GetComponent<ActorUseItems>().PickUp(param);
       }
       else if (param.hp > 0)
       {
           /*   省略   */
       }
   }
}

次にActorUseItemsクラスのThrowメソッドに追記します。

public bool Throw(Item it)
{
   if (usingItem == null)
   {
       if (it.type != EItemType.Magic) Message.Add(13, param.actorName, it.name);
       /*   省略   */
   }
   if (usingItem.GetComponent<ItemMovement>().Throwing(move.direction, param))
   {
       /*   省略   */
   }
   return false;
}

アイテムの種類がMagicであれば、壁に当たった時にそのまま削除し、また余計なメッセージを表示しないようにしました。
テストしてみます。壁に当たっても玉が消えて、投げたなどのメッセージが表示されなければOKです。

杖のコードの修正その2

さて、次は使用回数の問題です。今のままだと、一回振っただけで杖が無くなってしまいます。それはプレイヤーに優しくないので、ActorUseItemsのメソッドを修正することで対処しようと思います。

// メソッドを修正
private bool Shot(Item it)
{
   if (usingItem == null)
   {
       /*   省略   */
   }
   if (Throw(null))
   {
       it.hp--;
       if (it.hp < 1)
       {
           Message.Add(14, it.name);
           if (inventory.Remove(it)) return true;
           GameObject item = GetComponentInParent<Field>().GetExistItem(move.grid.x, move.grid.z);
           if (item != null) Destroy(item);
       }
       return true;
   }
   return false;
}

public bool Use(Item it)
{
   if (!isActive)
   {
       if (it.type == EItemType.Wand) return UseEffect(it);
       inventory.Remove(it);
   }
   return UseEffect(it);
}

public bool PickUpUse(Item it)
{
   if (!isActive)
   {
       if (it.type == EItemType.Wand) return UseEffect(it);
       GameObject item = GetComponentInParent<Field>().GetExistItem(move.grid.x, move.grid.z);
       if (item != null) Destroy(item);
   }
   return UseEffect(it);
}

アイテムの種類が杖の時はすぐに削除せず、火の玉を出し終わった後に杖のhpを減らして、それが0になったら砕け散るようにしました。
テストしてみましょう。杖を振ってもすぐに無くならず、hpに指定した値だけ杖を振れることを確認しておきます。さらに、地面の杖もそうであるか確認しておきます。

杖3

今回の杖はhpに5を指定したので5回振る事ができる

(オプション)strに左右されずにダメージを与える

個人的に杖を振るのにキャラクターの力は関係ないと思います。なので投げるアイテムの種類がMagicのときは、キャラクターの力を上乗せしないようにしたいと思います。
ItemMovementスクリプトを開いて、HitActorメソッドを以下のように書き換えます。

private void HitActor(ActorParamsController tParam, GameObject actor)
{
   Item param = GetComponent<ItemParamsController>().parameter;
   if (actor == null)
   {
       /*   省略   */
   }
   else
   {
       if (param.dmg > 0)
       {
           int str = param.dmg;
           if (param.type != EItemType.Magic) str += tParam.parameter.str;
           actor.GetComponent<ActorParamsController>().Damaged(str);
           if ((int)param.id > 1000)
           {
               if (param.type != EItemType.Magic) Message.Add(14, param.name);
               Destroy(gameObject);
           }
           else actor.GetComponent<ActorUseItems>().PickUp(param);
       }
       else if (param.hp > 0)
       {
           /*   省略   */
       }
   }
}

テストしてみます。杖以外の他のアイテムを投げた時は力の値が上乗せされて攻撃でき、魔法の玉を当てたときはアイテムのdmg値だけダメージを与えていることを確認します。

スクリーンショット 2020-05-21 3.01.52

(オプション)アイテムがぶつかったら振り向かせる

投げたアイテムがぶつかったときも、キャラクターを振り向かせてみたいと思います。
これは簡単です。ItemMovement.HitActorメソッドに追記するだけです。

private void HitActor(ActorParamsController tParam, GameObject actor)
{
   Item param = GetComponent<ItemParamsController>().parameter;
   if (actor == null)
   {
       /*   省略   */
   }
   else
   {
       if (param.dmg > 0)
       {
           // 以下2行を追記
           EDir d = DirUtil.ReverseDirection(tParam.GetComponent<ActorMovement>().direction);
           actor.GetComponent<ActorMovement>().SetDirection(d);
           int str = param.dmg;
           /*   省略   */
       }
       else if (param.hp > 0)
       {
           /*   省略   */
       }
   }

テストしてみましょう。まず敵を移動させず、常に攻撃する状態にします。
次に、杖で横から攻撃してみましょう。それで敵がプレイヤーの方を向いたらOKです。

という訳で、今回はここまでにします。
次回は(すっかり忘れていたのですが)アイテムの装備状態をロードできるようにしたいと思います。

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