Unity チュートリアルのタワーディフェンステンプレートを触ってみる(14)では「標的設定と砲撃編」を進め、砲弾の作成とタワーオブジェクトの改良を行った。今回は砲弾に対して追加した Damager コンポーネントの解説を進めていく。
1.標的設定と砲撃編 – Damager.cs
Damager.cs について稚拙ながら解説
「Damager.cs」は「Assets/Scripts/ActionGameFramework/Health/Damager.cs」の指しておりスクリプトについては以下の通り。内容としてはダメージ量の保持とダメージを与えられるかの判定を行っている。
[cce_csharp]using System; using Core.Health; using Core.Utilities; using UnityEngine; using Random = UnityEngine.Random; namespace ActionGameFramework.Health { /// <summary> /// A component that does damage to damageables /// </summary> public class Damager : MonoBehaviour { /// <summary> /// The amount of damage this damager does /// </summary> public float damage; /// <summary> /// The event that fires off when the damager has been damaged /// </summary> public Action<Vector3> hasDamaged; /// <summary> /// Random chance to spawn collision projectile prefab /// </summary> [Range(0, 1)] public float chanceToSpawnCollisionPrefab = 1.0f; /// <summary> /// The particle system to fire off when the damager attacks /// </summary> public ParticleSystem collisionParticles; /// <summary> /// The alignment of the damager /// </summary> public SerializableIAlignmentProvider alignment; /// <summary> /// Gets the alignment of the damager /// </summary> public IAlignmentProvider alignmentProvider { get { return alignment != null ? alignment.GetInterface() : null; } } /// <summary> /// The logic to set the value of the damage /// </summary> /// <param name="damageAmount"> /// The amount to set the damage by, /// will not be set for values less than zero /// </param> public void SetDamage(float damageAmount) { if (damageAmount < 0) { return; } damage = damageAmount; } /// <summary> /// Damagable will tell damager that it has successful hurt the damagable /// </summary> public void HasDamaged(Vector3 point, IAlignmentProvider otherAlignment) { if (hasDamaged != null) { hasDamaged(point); } } /// <summary> /// Instantiate particle system and play it /// </summary> void OnCollisionEnter(Collision other) { if (collisionParticles == null || Random.value > chanceToSpawnCollisionPrefab) { return; } var pfx = Poolable.TryGetPoolable<ParticleSystem>(collisionParticles.gameObject); pfx.transform.position = transform.position; pfx.Play(); } } }[/cce_csharp]
27行目 : 「[Range(0, 1)]」は浮動小数点(float)の値が 0 ~ 1 の間に指定する必要があることを指している。
55行目 : 「public void SetDamage(float damageAmount)」はダメージ量の変更を行っている。 0 以上の値でダメージの更新を行う。
67行目 : 「public void HasDamaged(Vector3 point, IAlignmentProvider otherAlignment)」は Damager が Damagable に対してダメージを与えることができるか確認を行っている。
78行目 : 「void OnCollisionEnter(Collision other)」は Damager が他のコリダーに入った時の処理を行っている。コリダーに入った時起こるエフェクトを実行している。