Unity チュートリアルのタワーディフェンステンプレートを触ってみる(9)

Unity チュートリアルのタワーディフェンステンプレートを触ってみる(8) では「DamageCollider.cs」の継承関係にある「DamageZone.cs」の解説を行っていた。今回は「DamageCollider.cs」について解説を行っていく。

「DamageCollider.cs」は「DamageZone.cs」を継承している。そのため前回は「DamageCollider.cs」解説する前に「DamageZone.cs」について解説を行っていた。「DamageZone.cs」の解説についてはこちらを参照してほしい。

1.タワー編 – DamageCollider.cs

DamageCollider.cs について稚拙ながら解説

「DamageCollider.cs」は「Assets/Scripts/ActionGameFramework/Health/DamageCollider.cs」の指しておりスクリプトについては以下の通り。内容としてはダメージを受けた際の当たり判定を行っている。

[cce_csharp]using UnityEngine;

namespace ActionGameFramework.Health
{
    /// <summary>
    /// Damage collider - a collider based implementation of DamageZone
    /// </summary>
    [RequireComponent(typeof(Collider))]
    public class DamageCollider : DamageZone
    {
        /// <summary>
        /// On collision enter, see if the colliding object has a Damager and then make the damageableBehaviour take damage
        /// </summary>
        /// <param name="c">The collider</param>
        protected void OnCollisionEnter(Collision c)
        {
            var damager = c.gameObject.GetComponent<Damager>();
            if (damager == null)
            {
                return;
            }
            LazyLoad();
            
            float scaledDamage = ScaleDamage(damager.damage);
            Vector3 collisionPosition = ConvertContactsToPosition(c.contacts);
            damageableBehaviour.TakeDamage(scaledDamage, collisionPosition, damager.alignmentProvider);
            
            damager.HasDamaged(collisionPosition, damageableBehaviour.configuration.alignmentProvider);
        }

        /// <summary>
        /// Averages the contacts to get the position.
        /// </summary>
        /// <returns>The average position.</returns>
        /// <param name="contacts">Contacts.</param>
        protected Vector3 ConvertContactsToPosition(ContactPoint[] contacts)
        {
            Vector3 output = Vector3.zero;
            int length = contacts.Length;

            if (length == 0)
            {
                return output;
            }

            for (int i = 0; i < length; i++)
            {
                output += contacts[i].point;
            }

            output = output / length;
            return output;
        }
    }
}[/cce_csharp]

8行目 : 「[RequireComponent(typeof(Collider))] は前回も解説した通り、必須のコンポーネントを定義している。必須のコンポーネントについては「typeof(Collider)」で指定しており、ここでは Collider を必ず定義しなければならないという定型文となっている。

9行目 : 「public class DamageCollider : DamageZone」は前回解説した「DamageZone」を継承していることを指している。「DamageZone」についてはこちらを参照してほしい。

15行目 : 「protected void OnCollisionEnter(Collision c)」は他の collider や rigidbody に触れたときに呼ばれる、Unity で定義している関数である。ここでは colider や rigidbody に触れたときダメージを与えるものであるならば、前回解説した「DamageZone」の遅延読込を行ってダメージを受けるという計算を行っている。

Unity の解説では『この collider/rigidbody は他の collider/rigidbody に触れたときに OnCollisionEnter は呼び出されます。』となっている。Unity の公式ページ解説についてはこちらを参照してほしい。

36行目 : 「protected Vector3 ConvertContactsToPosition(ContactPoint[] contacts)」では「protected void OnCollisionEnter(Collision c)」の引数である Collision から接触情報を取得し、すべてのベクトルデータの平均地点を算出している。

%d人のブロガーが「いいね」をつけました。