Unity チュートリアルのタワーディフェンステンプレートを触ってみる(8) では「DamageCollider.cs」の継承関係にある「DamageZone.cs」の解説を行っていた。今回は「DamageCollider.cs」について解説を行っていく。
「DamageCollider.cs」は「DamageZone.cs」を継承している。そのため前回は「DamageCollider.cs」解説する前に「DamageZone.cs」について解説を行っていた。「DamageZone.cs」の解説についてはこちらを参照してほしい。
Unity チュートリアルのタワーディフェンステンプレートを触ってみる(5)、(6)、(7) と Tower.cs スクリプトの解説を行ってきた。今回は引き続きUnity チュートリアルのタワーディフェンステンプレートを触ってみる(4)に記載している通り 「DamageCollider.cs」 がその前に継承関係にある「DamageZone.cs」の解説を行っていく。「DamageCollider.cs」は「DamageZone.cs」を継承している。そのため今回は「DamageCollider.cs」解説する前に「DamageZone.cs」について解説を行っていく。1.タワー編 – DamageZone.csDamageZo... Unity チュートリアルのタワーディフェンステンプレートを触ってみる(8) - StudioFun |
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」についてはこちらを参照してほしい。
Unity チュートリアルのタワーディフェンステンプレートを触ってみる(5)、(6)、(7) と Tower.cs スクリプトの解説を行ってきた。今回は引き続きUnity チュートリアルのタワーディフェンステンプレートを触ってみる(4)に記載している通り 「DamageCollider.cs」 がその前に継承関係にある「DamageZone.cs」の解説を行っていく。「DamageCollider.cs」は「DamageZone.cs」を継承している。そのため今回は「DamageCollider.cs」解説する前に「DamageZone.cs」について解説を行っていく。1.タワー編 – DamageZone.csDamageZo... Unity チュートリアルのタワーディフェンステンプレートを触ってみる(8) - StudioFun |
15行目 : 「protected void OnCollisionEnter(Collision c)」は他の collider や rigidbody に触れたときに呼ばれる、Unity で定義している関数である。ここでは colider や rigidbody に触れたときダメージを与えるものであるならば、前回解説した「DamageZone」の遅延読込を行ってダメージを受けるという計算を行っている。
Unity の解説では『この collider/rigidbody は他の collider/rigidbody に触れたときに OnCollisionEnter は呼び出されます。』となっている。Unity の公式ページ解説についてはこちらを参照してほしい。
この collider/rigidbody は他の collider/rigidbody に触れたときに OnCollisionEnter は呼び出されます。 Collider-OnCollisionEnter(Collision) - Unity スクリプトリファレンス - docs.unity3d.com |
36行目 : 「protected Vector3 ConvertContactsToPosition(ContactPoint[] contacts)」では「protected void OnCollisionEnter(Collision c)」の引数である Collision から接触情報を取得し、すべてのベクトルデータの平均地点を算出している。