見出し画像

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

前回の記事はこちら
前回は消費アイテムによる体力回復を実装しました。

満腹度の実装

今回は満腹度の実装から始めたいと思います。これはParamsクラスにパラメーターを追加することで対応しようと思います。という訳でParamsクラスに以下のパラメーターを追加して下さい。

public float food;    // 満腹度
public float foodmax; // 満腹度最大値

パラメーターを追加したので、ActorParamsControllerクラスのこれらのメソッドにも追記しておきましょう。

// GetParamsメソッドに以下を追記
p.food = parameter.food;
p.foodmax = parameter.foodmax;

// SetParamsメソッドに以下を追記
parameter.food = p.food;
parameter.foodmax = p.foodmax;

// GetParameterFromLvメソッドのfor文内に以下を追記
p.food += paramsData[i].food;
p.foodmax += paramsData[i].foodmax;

一定回数行動したら満腹度を減らす

次に、満腹度を減少するコードをSequenceManagerクラスに書いていこうと思います。ですがその前に、ActorParamsControllerクラスに満腹度を減少させるメソッドと、減少値を示すパラメーターを作成しようと思います。

public float decFoodPt = 0.25f;

/**
* 満腹度を減少させる
*/
public void DecreaseFood()
{
   if (parameter.food > 0)
   {
       parameter.food -= decFoodPt;
       if (parameter.food < 0) parameter.food = 0;
   }
   else parameter.hp--;
}

もし満腹度が0以下だったら、代わりに体力を減らしています。
それではSequenceManagerスクリプトを開いて、以下を記述しましょう。

// 以下のメソッドを追記
/**
* 満腹度を減少させる
*/
private void DecreaseFood()
{
    playerAction.GetComponent<ActorParamsController>().DecreaseFood();
}

// Updateメソッドの「if (pAct == EAct.TurnEnd)」内に追記
DecreaseFood();


テストしてみましょう。行動すると、満腹度が減少しています。

スクリーンショット 2020-05-19 9.18.51

確認が終わったら、プレイヤーのデータファイルに満腹度と満腹度最大値を記述して、パラメーターに反映しておくのを忘れずに行って下さい。

食べ物アイテムの効果の実装

満腹度が実装出来たところで、今回の本題です。リンゴなどの食べ物アイテムを食べると、満腹度が回復するようにしようと思います。
満腹度回復のメッセージを追加したら、ActorUseItems.Recoveryメソッドを変更して下さい。

private void Recovery(Item it)
{
   if (it.hp == 0 && it.food == 0)
   {
       Message.Add(18);
       return;
   }
   GameObject effectObj = Resources.Load<GameObject>("Prefabs/RecoveryEffect");
   effect = Instantiate(effectObj, transform);
   if (it.hp > 0)
   {
       int hp = param.parameter.hpmax - param.parameter.hp;
       hp = it.hp < hp ? it.hp : hp;
       Message.Add(17, param.actorName, hp.ToString());
       param.parameter.hp += hp;
   }
   if (it.food > 0)
   {
       param.parameter.food += it.food;
       if (param.parameter.food > param.parameter.foodmax)
       {
           param.parameter.food = param.parameter.foodmax;
           Message.Add(19);
           return;
       }
       Message.Add(20);
   }
}

今回追加したメッセージはこの通りです。

スクリーンショット 2020-05-19 9.53.11

テストしてみます。満腹度が減っている状態で何か食べ物を食べると、満腹度が回復するはずです。

スクリーンショット 2020-05-19 10.16.34

満腹度が4減っている状態でリンゴ(満腹度+30)を食べた時

スクリーンショット 2020-05-19 10.18.51

満腹度が50減っている状態でリンゴを食べた時

回復処理はActorParamsControllerクラスで行う

エフェクト処理と実際の処理が分かれた所で、回復処理をActorParamsControllerクラスに移したいと思います。
ActorParamsControllerクラスに新たなメソッドを追加して下さい。

/**
* 満腹度を回復する
*/
public void RecoveryFood(int food)
{
   parameter.food += food;
   if (parameter.food > parameter.foodmax)
   {
       parameter.food = parameter.foodmax;
       Message.Add(19);
       return;
   }
   Message.Add(20);
}

/**
* 体力を回復する
*/
public void RecoveryHp(int p)
{
   int hp = parameter.hpmax - parameter.hp;
   hp = p < hp ? p : hp;
   Message.Add(17, actorName, hp.ToString());
   parameter.hp += hp;
}

またそれに伴い、ActorUseItems.Recoveryメソッドも変更しておきます。

private void Recovery(Item it)
{
   /*    省略    */
   GameObject effectObj = Resources.Load<GameObject>("Prefabs/RecoveryEffect");
   effect = Instantiate(effectObj, transform);
   if (it.hp > 0) param.RecoveryHp(it.hp);
   if (it.food > 0) param.RecoveryFood(it.food);
}

投げてぶつかった時の効果

次はアイテムを投げてキャラクターにぶつかった時に発生するアイテム効果を実装したいと思います。
ItemMovementスクリプトを開いて下さい。新しいメソッドを追加し、Throwingメソッドを書き換えます。

/**
* もしキャラクターにぶつかったらアイテム効果を発生させる
*/
private void HitActor(ActorParamsController tParam, UnityEngine.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);
       }
       else if (param.hp > 0)
           actor.GetComponent<ActorParamsController>().RecoveryHp(param.hp);

       Message.Add(14, param.name);
       Destroy(gameObject);
   }
}

public bool Throwing(EDir d, ActorParamsController tParam)
{
   if (!isThrowing)
   {
       SetThrowPosition(d);
       isThrowing = true;
   }
   if (Moving() == EAct.MoveEnd)
   {
       Field field = GetComponentInParent<Field>();
       HitActor(tParam, field.GetExistActor(grid.x, grid.z));
       if (!gameObject.Equals(field.GetExistItem(grid.x, grid.z)))
           Destroy(gameObject);
       isThrowing = false;
       return true;
   }
   return false;
}

今回追加したメッセージは以下の通りです。

スクリーンショット 2020-05-19 16.58.32

Throwingに引数を追加したので、ActorUseItemsクラスのThrowとPickUpThrowメソッドのThrowingメソッドを変更しておきます。

usingItem.GetComponent<ItemMovement>().Throwing(move.direction, param)

テストしてみます。 アイテムのdmgに値を設定している場合は敵にダメージ、dmgが0でhpに値が設定されている時は敵を回復させられたと思います。

投げた時のアイテム効果

一応投げたアイテムの効果は発揮されました。しかし本当に当たったのか今のままではわかりにくいですね。
という訳で次回はアイテムが当たった時にエフェクトをつける所から始めたいと思います。

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