見出し画像

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

前回の記事はこちら
前回はアイテムがキャラクターにぶつかったときのエフェクトを実装しました。

装備アイテムがぶつかったとき

今の実装状態だと、キャラクターに装備アイテムがぶつかると、もれなく「砕け散り」ます。
ですが普通、装備アイテムは砕け散らないだろうと思います。
という訳で装備アイテムがぶつかったときはキャラクターにダメージを与えて、そのキャラクターのインベントリに空きがあれば拾わせ、なければその場に落とすことにします。なお、そのキャラクターの足下に既にアイテムがある場合は投げたアイテムを消すことにします。
ItemMovementスクリプトを開いて、新しいメソッドを追加し、HitActorとThrowingメソッドを修正して下さい。

// 次のメソッドを追加
/**
* エフェクトを発生させる
*/
private void HitEffect(GameObject actor)
{
   Item param = GetComponent<ItemParamsController>().parameter;
   if (actor == null) effect.Play(EffectManager.EType.HitItem, gameObject);
   else
   {
       if (param.dmg > 0)
           effect.Play(EffectManager.EType.HitItem, actor);
       else if (param.hp > 0)
           effect.Play(EffectManager.EType.Recovery, actor);
   }
}

// 次のメソッドを修正
private void HitActor(ActorParamsController tParam, GameObject actor)
{
   Item param = GetComponent<ItemParamsController>().parameter;
   if (actor == null) Message.Add(15, param.name);
   else
   {
       if (param.dmg > 0)
       {
           int str = tParam.parameter.str + param.dmg;
           actor.GetComponent<ActorParamsController>().Damaged(str);
           if ((int)param.id > 1000)
           {
               Message.Add(14, param.name);
               Destroy(gameObject);
           }
           else actor.GetComponent<ActorUseItems>().PickUp(param);
       }
       else if (param.hp > 0)
       {
           /*    省略    */
       }
   }
}

public bool Throwing(EDir d, ActorParamsController tParam)
{
   /*    省略    */
   if (isPlayingEffect && !effect.IsPlaying())
   {
       Field field = GetComponentInParent<Field>();
       HitActor(tParam, field.GetExistActor(grid.x, grid.z));
       if (!gameObject.Equals(field.GetExistItem(grid.x, grid.z)))
           Destroy(gameObject);
       isPlayingEffect = false;
       return true;
   }
   if (!effect.IsPlaying() && Moving() == EAct.MoveEnd)
   {
       HitEffect(GetComponentInParent<Field>().GetExistActor(grid.x, grid.z));
       isThrowing = false;
       if (!(isPlayingEffect = effect.IsPlaying())) return true;
   }
   return false;
}

ついでにActorUseItemsクラスのPickUpメソッドも変更しておきましょう。

public bool PickUp(Item it)
{
   if (inventory.Add(it))
   {
       GameObject item = GetComponentInParent<Field>().GetExistItem(move.grid.x, move.grid.z);
       if (item != null) Destroy(item);
       Message.Add(8, param.actorName, it.name);
   }
   return true;
}

テストしてみます。まずは消費アイテムを投げて、今まで通り消えるか確認します。それができたら、今度は装備アイテムを投げて、アイテムが消えずに残るか、あるいは敵がそのアイテムを拾うかどうか確認して下さい。
最後に、アイテムが重なったら投げたアイテムが消えるかどうかも確認しておきましょう。

装備アイテムぶつかったとき

ちなみに壁に当たったときもエフェクトが表示されるようになりました。

壁に当たった時のエフェクト

杖のデータ

まだ少し余裕がありそうなので、杖の実装の話をしたいと思います。
杖は火の玉など、魔法の玉を打てるアイテムのことを指します。
魔法の玉はキャラクターか壁に当たるまで真っ直ぐ進み、キャラクターに当たったときはダメージを与えることができます。
そう、投げる処理とほとんど同じなのです(一つ違うのは壁に当たったときも消えるということぐらいですかね)。
つまりこれは投げる処理の使い回しで何とかなりそうな感じがします。
という訳で今回は魔法の玉もアイテムとして定義しておき、「魔法の玉」というアイテムを杖を使って投げることで、魔法を実現したいと思います。
まずは杖のプレハブと魔法の玉のプレハブを用意しておきます。
(魔法の玉はエフェクトでも構いません)
筆者は杖の画像として、以下を使用します。

スクリーンショット 2020-05-20 4.57.03

「[Free] 6 Weapons」で検索すると出てくると思います。
次に、杖と魔法の玉のアイテムIDとアイテムタイプを定義します。

// EItemに追加
WAND01 = 1041,
MAGIC01 = 1081

// EItemTypeに追加
Wand,
Magic

最後にアイテムデータファイルのGoodsの方にデータを記載します。
筆者は以下のようになりました。

スクリーンショット 2020-05-20 20.46.10

スクリーンショット 2020-05-20 20.46.29

杖のhpは使用できる回数を表します。
(魔法の玉は拾えませんのでdetailは書かなくてもいいです)
また、発射する玉の種類を記述する「shot」を増やしました。それに伴い、Itemクラスのパラメーターを増やしておきましょう。

// Itemクラスに追加
public EItem shot;

// Getメソッドに追加
​p.shot = shot;

アイテムデータを増やしたら、データファイルをインポートし直しておきます。

という訳で、今回はここまでです。
次回は実際に杖のスクリプトを書いていきたいと思います。


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