【Unity】ModifierListでスカラを実装してみる【Modiferty】

はじめに

「Modiferty」はステータス管理ライブラリです。

「Modifertyの概要について知らない」という人は、まず以下の記事を見てもらえると分かりやすいです。

ゲームのステータス管理にModifertyを使う【Unity】

ModifierListとは?

ModifiablePropertyが「個別のステータスを変動させる」のに対して、

ModifierListは「与えられた値を変動させる」ことができます。

例えば「ダメージを受けるときに、ダメージの値に対して前処理をする」みたいなことができるようになります。(ポケモンで例えると「てっぺき」、ドラクエなら「スカラ」を実装できます)

具体的な実装例

では実際に「受けるダメージを減らす処理」を実装してみましょう。

1.ModifierListを宣言してみる


using UnityEngine;
using MackySoft.Modiferty;

public class Character : MonoBehaviour {

	// キャラクターの体力
	public int health = 3;

	// ダメージに対して前処理を行うModifierList
	public ModifierList<int> damageModifiers = new ModiferList<int>();

}

もし体力の型がintではなくfloatなら、ModifierList<float>を使用します。

これで、受けるダメージを減らす準備ができました。

2.ModifierListにModifierを追加する

次にキャラクターの防御力を上げるアイテムを実装します。


using UnityEngine;
using MackySoft.Modiferty;

public class DefenseUpItem : MonoBehaviour {

	// amountは減算量
	public SubstractiveModifierInt substractDamageModifier = new SubstractiveModifierInt(amount: 1);

	void OnCollisionEnter (Collision collision) {
		Character target = collision.collider.GetComponentInParent<Character>();
		if (target != null) {
			// target.damageModifiersに、数値を減算するModifierを追加
			target.damageModifiers.Add(substractDamageModifier);
		}
	}
}

このDefenseUpItemにぶつかったキャラクターのdamageModifiersには、SubstractiveModifierInt(値を減算するModifier)が追加されます。

つまり、そのキャラクターが受けるダメージを減算することができます。

今回はSubstractiveModifierIntを使いましたが、「ダメージを0.9倍する」みたいな実装をしたいならMultiplyModifierを使うなどが可能です

3.攻撃を受ける処理

キャラクターがダメージを受ける処理を実装します。


using UnityEngine;
using MackySoft.Modiferty;

public class Character : MonoBehaviour {

	// キャラクターの体力
	public int health = 3;

	// ダメージに対して前処理を行うModifierList
	public ModifierList<int> damageModifiers = new ModiferList<int>();

	public int attackPower = 2;

	// 攻撃を受ける処理
	public void TakeDamage (Character attacker) {

		// 受けるダメージにdamageModifiersを適用する
		health -= damageModifiers.Evaluate(attacker.attackPower);

	}

}

大事なのがdamageModifiers.Evaluate(attacker.attackPower)です。

ModifierListのEvaluate関数が、attacker.attackPowerに対して変更を加えます。

もしダメージを受けるキャラクターがDefenseUpItemの効果を受けていたとすると、

「2(攻撃側キャラクターの攻撃力)ー1(SubstractiveModifierIntの減算量)」

受けるダメージは「1」になります。

4.ModifierListからModifierを削除

「てっぺき」でも「スカラ」でも、キャラクターを永久に強化しているわけにはいきません。強化を解除する時は、ModifierListからModifierを削除しましょう。

基本的にはList<T>と同じように使用可能で、加えて便利な関数を追加しています。



// 特定のModifierを削除する
damageModifiers.Remove(someModifier);

// すべてのModifierを削除する。
damageModifiers.Clear();

// 型が一致したすべてのModifierを削除する。
// この場合はSubstractiveModifierIntをすべて削除する。
damageModifiers.RemoveAll<SubstractiveModifierInt>();

// 条件に一致したすべてのModifierを削除する。
// この場合はSubstractiveModifierIntかつ、Amount(減算量)が3以上のModifierをすべて削除する。
damageModifiers.RemoveAll(modifier => {
	return (modifier is SubstractiveModifierInt result) && (result.Amount >= 3);
});

これで「受けるダメージを減らす処理」の実装は完了です。

おわりに

「Modiferty」はMITライセンスなので、かなり自由に使うことができます。

使えそうと思ったら1度試してみてください!

Github: https://github.com/mackysoft/Modiferty

記事をシェアしてもらえると嬉しいです!