【Unity】3Dローグライクゲームの作り方〜Step9&10-17〜
前回の記事はこちら。
前回は装備関連の実装を色々しました。
ポーション効果の実装
筆者の作成したポーションは基本的には体力を回復します。という訳でこのアイテム使用時には体力が回復するようにしましょう。
ポーション使用時と体力回復時のメッセージを追加したら、早速コードを書いていきます。
まずActorUseItemsスクリプトを開いて、新しいメソッドを作成し、UseとPickUpUseメソッドを変更します。
// メソッドを追加
/**
* 回復する
*/
private void Recovery(Item it)
{
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.hp == 0 && it.food == 0) Message.Add(18);
}
/**
* 使用したアイテムによって処理を分岐させる
*/
private void UseEffect(Item it)
{
switch (it.type)
{
case EItemType.Food:
Message.Add(5, param.actorName, it.name);
Recovery(it);
break;
case EItemType.Portion:
Message.Add(16, param.actorName, it.name);
Recovery(it);
break;
}
}
// メソッドを変更
public bool Use(Item it)
{
UseEffect(it);
inventory.Remove(it);
return true;
}
public bool PickUpUse(Item it)
{
GameObject item = GetComponentInParent<Field>().GetExistItem(move.grid.x, move.grid.z);
if (item == null) return true;
UseEffect(it);
Destroy(item);
return true;
}
今回追加したメッセージは以下の通りです。
Recoveryは体力と満腹度を回復するメソッドにしようと思っています。なのでhp(HP回復値)が0より大きいときのみ体力回復処理をしています。また、HPの最大値を超えて回復してはならないので、途中でアイテム回復量とHP減少量を比べて、小さい値を実際の回復量にしています(勿論ここの処理はMathf.Min関数を使っても構いません!)。
UseEffectメソッドはアイテムの種類によって表示するメッセージを変えたり、アイテム効果を変えたりする(予定)のメソッドですね。
テストしてみましょう。体力が減った状態でポーションなり回復するアイテムを使ってみます。それで体力が回復すればOKです。
体力が3減った時に初級ポーション(体力10回復)を使った場合
体力が10以上減った時に初級ポーションを使った場合
エフェクトのインポート
さて、本来ならこれで完成......なのですが。せっかくの回復処理なのに、何のエフェクトもないのは寂し過ぎます。という訳で体力回復処理にエフェクトを付けたいと思います。
標準のエフェクトを使ってもいいのですが、それだけだとワンパターンのエフェクトしか作れませんし、どうせこの後他のエフェクトも欲しくなるだろうということで、アセットストアからインポートしてきます。
筆者が今回インポートするのはこちら、「DL Fantasy RPG Effects」です。
皆様も各自好きなエフェクトを探してみて下さい。
回復処理にエフェクトをつける
それでは回復処理にエフェクトを付けていきたいと思います。
まず、ヒエラルキータブ内で空のオブジェクトを作成、名前を「RecoveryEffect」にします。その階層下にエフェクトのプレハブなどを入れて下さい。
(ループのチェックは外しておきましょう)
調節などが終わったら、RecoveryEffectをプレハブ化します。
それができたらスクリプトを書いていきましょう。ActorUseItemsスクリプトを開いて下さい。新たなパラメーターを作成し、RecoveryとUseEffectメソッドを変更します。
// パラメーターを追加
private GameObject effect = null;
// メソッドを変更
private void Recovery(Item it)
{
if (it.hp > 0)
{
GameObject effectObj = Resources.Load<GameObject>("Prefabs/RecoveryEffect");
effect = Instantiate(effectObj, transform);
int hp = param.parameter.hpmax - param.parameter.hp;
/* 省略 */
}
if (it.hp == 0 && it.food == 0) Message.Add(18);
}
private bool UseEffect(Item it)
{
if (effect == null)
{
switch (it.type)
{
/* 省略 */
}
}
else
{
if (effect.GetComponentInChildren<ParticleSystem>().isStopped)
{
Destroy(effect);
return true;
}
}
return false;
}
そしてUseとPickUpUseメソッドも変更します。
public bool Use(Item it)
{
if (effect == null) inventory.Remove(it);
return UseEffect(it);
}
public bool PickUpUse(Item it)
{
if (effect == null)
{
GameObject item = GetComponentInParent<Field>().GetExistItem(move.grid.x, move.grid.z);
if (item != null) Destroy(item);
}¥
return UseEffect(it);
}
テストしてみましょう。何でもいいので回復アイテムを使ってみます。するとエフェクトが現れて、消えたと思います。エフェクト再生中敵が動かず、消えた後Playerの階層下にRecoveryEffectが残っていないことを確認します。
エフェクトをつけると効果音を入れたくなりますね。
でもそれは最後にして(もしかしたらしないかもしれませんが)、次回は満腹度をプレイヤーに実装したいと思います。
この記事が気に入ったらサポートをしてみませんか?