Unity チュートリアルのタワーディフェンステンプレートを触ってみる(10)
Unity チュートリアルのタワーディフェンステンプレートを触ってみる(8) 、(9)では「DamageCollider.cs」と継承関係にある「DamageZone.cs」の解説を行っていた。今回は「SimpleAlignment.cs」とインタフェースとなっている「IAlignmentProvider.cs」について解説を行っていく。
「SimpleAlignment.cs」はインタフェースとして「IAlignmentProvider.cs」があるため、インタフェースである「IAlignmentProvider.cs」から順に解説を行っていく。
インタフェースとは
『
- オブジェクト指向プログラミングにおいて、複数の種類のオブジェクトに関して共通する機能を実装するためのメッセージの規格を定義したもの。あるインタフェースに従ったメッセージを送受信できるようにすることを、そのインタフェースを実装するという。
Java などのプログラミング言語では(一般的な意味での)インタフェースを規定し、クラスが実装しなければならない、抽象型を指す。
』(Wikipedia ソフトウェアインタフェースより引用)
とのことだが、分かりづらいと思われるため必ず作成する必要のある関数を定義するものという認識くらいでまずは良いと思われる。
1.タワー編 – IAlignmentProvider.cs
IAlignmentProvider.cs について稚拙ながら解説
「IAlignmentProvider.cs」は「Asset/Scripts/Core/Health/IAlignmentProvider.cs」の指しておりスクリプトについては以下の通り。内容としては CanHarm (ダメージを与えることができる)という関数を定義している。
[cce_csharp]using System; using Core.Utilities; namespace Core.Health { /// <summary> /// An interface for objects which can provide a team/alignment for damage purposes /// </summary> public interface IAlignmentProvider : ISerializableInterface { /// <summary> /// Gets whether this alignment can harm another /// </summary> bool CanHarm(IAlignmentProvider other); } /// <summary> /// Concrete serializable version of interface above /// </summary> [Serializable] public class SerializableIAlignmentProvider : SerializableInterface<IAlignmentProvider> { } }[/cce_csharp]
9行目 : 「public interface IAlignmentProvider : ISerializableInterface」ではこのクラスはインタフェースとして「ISerializableInterface」があることを指している。「ISerializableInterface」については何も定義がないためここでは省略させていただく。
14行目 : 「bool CanHarm(IAlignmentProvider other);」 ではこのインタフェースを持つクラスには「CanHarm」という関数を作成しなければならないということを定義している。このクラス自体では「CanHarm」の内容が処理であるかは認識していない。
以降に関しては今回使用していないため、ここでは省略させていただく。
2.タワー編 – SimpleAlignment.cs
SimpleAlignment.cs について稚拙ながら解説
「SimpleAlignment.cs」は「Asset/Scripts/Core/Health/SimpleAlignment.cs」の指しておりスクリプトについては以下の通り。内容としては敵(ダメージを与えることができる)のオブジェクトであるかどうかの判定を行っている。
[cce_csharp]using System.Collections.Generic; using UnityEngine; namespace Core.Health { /// <summary> /// A simple scriptable object that defines which other alignments it can harm. It can never harm /// any other alignment that's not a SimpleAlignment /// </summary> [CreateAssetMenu(fileName = "Alignment.asset", menuName = "StarterKit/Simple Alignment", order = 1)] public class SimpleAlignment : ScriptableObject, IAlignmentProvider { /// <summary> /// A collection of other alignment objects that we can harm /// </summary> public List<SimpleAlignment> opponents; /// <summary> /// Gets whether the given alignment is in our known list of opponents /// </summary> public bool CanHarm(IAlignmentProvider other) { if (other == null) { return true; } var otherAlignment = other as SimpleAlignment; return otherAlignment != null && opponents.Contains(otherAlignment); } } }[/cce_csharp]
10行目 : 「[CreateAssetMenu(fileName = “Alignment.asset”, menuName = “StarterKit/Simple Alignment”, order = 1)]」は Unity チュートリアルのタワーディフェンステンプレートを触ってみる(2)で解説した通り、アセットメニューに対してメニューに追加する定型文である。
11行目 : 「public class SimpleAlignment : ScriptableObject, IAlignmentProvider」は以前に解説を行った ScriptableObject を継承し、インタフェースとして上記の IAlignmentProvider を持っていることを指している。
12行目 : 「public bool CanHarm(IAlignmentProvider other)」では「public List<SimpleAlignment> opponents;」で登録されている敵の情報と同じものがあるかどうかを判定している。
これにて、1.タワー編の解説は一通り完了である。引き続き、エージェント編を進めていきたいと思う。