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」の指しておりスクリプトについては以下の通り。内容としてはダメージを受けた際の当たり判定を行っている。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55 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;
}
}
}
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 から接触情報を取得し、すべてのベクトルデータの平均地点を算出している。