Unity チュートリアルのタワーディフェンステンプレートを触ってみる(17)
Unity チュートリアルのタワーディフェンステンプレートを触ってみる(16)では砲弾に対して追加した HitscanAttack コンポーネントについて解説を行った。今回は LaserTower_0 に追加した AttackAffector コンポーネントの継承関係にある Affector を行っていく。
1.標的設定と砲撃編 – Affector.cs
Affector.cs について稚拙ながら解説
「Affector.cs」は「Assets/Scripts/TowerDefense/Affectors/Affector.cs」の指しておりスクリプトについては以下の通り。内容としては Affector の初期化のみを行っている。
[cce_csharp]using Core.Health; using UnityEngine; namespace TowerDefense.Affectors { /// <summary> /// A class for providing information on to whether /// the children classes effects are valid /// </summary> public abstract class Affector : MonoBehaviour { /// <summary> /// Short description for affector for displaying in the UI /// </summary> public string description; /// <summary> /// Gets or sets the alignment /// </summary> public IAlignmentProvider alignment { get; protected set; } /// <summary> /// The physics mask to check against /// </summary> public LayerMask enemyMask { get; protected set; } /// <summary> /// Initializes the effect with search data /// </summary> /// <param name="affectorAlignment"> /// The alignment of the effect for search purposes /// </param> /// <param name="mask"> /// The physics layer of to search for /// </param> public virtual void Initialize(IAlignmentProvider affectorAlignment, LayerMask mask) { alignment = affectorAlignment; enemyMask = mask; } /// <summary> /// Initializes the effect with search data /// </summary> /// <param name="affectorAlignment"> /// The alignment of the effect for search purposes /// </param> public virtual void Initialize(IAlignmentProvider affectorAlignment) { Initialize(affectorAlignment, -1); } } }[/cce_csharp]
36行目 : 「public virtual void Initialize(IAlignmentProvider affectorAlignment, LayerMask mask)」は Affector の初期化を行っている。IAlignmentProvider と LayerMask を引数として自身のグローバル変数に設定している。
48行目 : 「public virtual void Initialize(IAlignmentProvider affectorAlignment)」も同様に Affector の初期化を行っている。IAlignmentProviderを引数として自身のグローバル変数に設定している。
スクリプトを作成する際、基本的に関数名は同一のものを使用することができない。しかしながら、今回の Affector では Initialize を2つ定義している。これはオーバーロードと言って内容については以下の通り。
『多重定義 (たじゅうていぎ) あるいは オーバーロード (英: overload) とは、プログラミング言語において同一の名前(シンボル)を持つ関数あるいはメソッドおよび同一の演算子記号について複数定義し、利用時にプログラムの文脈に応じて選択することで複数の動作を行わせる仕組みである。 例えば整数型や浮動小数点型、複素数型の値について同じ「abs」という関数を定義して絶対値を求める、型ごとに個々の意味で名前やIDを返す関数を定義するなどが挙げられる。多重定義する対象に応じてそれぞれ関数の多重定義[1]、演算子の多重定義[2]、メソッドの多重定義[3]と呼ばれる。メソッドの多重定義の特殊なケースとして、コンストラクタの多重定義がある。また、Common Lispなどでは、多重定義可能な関数としてgeneric function(en:Generic function)がある(このgenericはジェネリックプログラミングのジェネリックである)。
動作の「上書き」を意味するオーバーライド[4]とはまったく異なる概念である。オーバーライドは動的なポリモーフィズム(多態)に利用される。』(Wilipedia 多重定義より引用)
上記のような内容ではあるが、いささか分かりづらいと思うので「引数が異なっていれば同じ関数名使用できる。」位の認識でいると良いと思う。