Unity チュートリアルのタワーディフェンステンプレートを触ってみる(11)
Unity チュートリアルのタワーディフェンステンプレートを触ってみる(10) では「SimpleAlignment.cs」とインタフェースとなっている「IAlignmentProvider.cs」について解説を行っていた。今回からエージェント(敵ユニット)の作成を進めていく。
1.エージェント編 – 概要
Unity チュートリアルのタワーディフェンステンプレートを触ってみる(2)で述べた通り、Unity のチュートリアルに沿って作業を進めていく。ということで次にエージェントについて進めていく。
『さて、タワーを作成したので、タワーに攻撃をしかけてくる何かが必要になります。このセクションでは、プレイヤーの本拠地を攻撃しようとする敵エージェントを作成する方法について説明します。敵エージェントをステージの周りで移動させるプロセスの大部分は、ステージの設定 で説明します。その前に、まずエージェントゲームオブジェクトに必要なコンポーネントを設定する必要があります。
これらの自立したキャラクターをここでは、「敵 (Enemy)」ではなく「エージェント (Agent)」と表現することにします。』
2.エージェント編 – エージェント設定データを作成する
『まず Agent Configuration を作成します。
- Project ウィンドウで、左上の Create メニューをクリックし、Create > Tower Defense > Agent Configuration の順に選びます。
Agent Configuration が作成できたので、エージェントの値を設定できます。』
とのことなので、Agent Configuration を作成を作成していく。
Agent Configuration では名前と説明、Prefab の設定を行う必要があるが、今回はすでに、作成済みのデータが「Asset/Data/Agents」にデータがあるためそちらを使用していく。
稚拙ながら少々解説
「Agent Configuration」は 「Assets/Scripts/TowerDefense/Agents/Data/AgentConfiguration.cs」ファイルをもとに生成している。内容としては Tower の設定情報を保持するだけの簡単なクラス構成となっている。
[cce_csharp]using UnityEngine; namespace TowerDefense.Agents.Data { [CreateAssetMenu(fileName = "AgentConfiguration.asset", menuName = "TowerDefense/Agent Configuration", order = 1)] public class AgentConfiguration : ScriptableObject { /// <summary> /// The name of the agent /// </summary> public string agentName; /// <summary> /// Short summary of the agent /// </summary> [Multiline] public string agentDescription; /// <summary> /// The Agent prefab that will be used on instantiation /// </summary> public Agent agentPrefab; } }[/cce_csharp]
3行目「namespace」は簡単に例えるとフォルダ構成のようなもので、「TowerDefense」フォルダの中にある「Agents」フォルダの中にある「Data」フォルダを指しているようなものだと思っていただくのがわかりやすいだろう。
5行目「[CreateAssetMenu(fileName = “AgentConfiguration.asset”, menuName = “TowerDefense/Agent Configuration”, order = 1)]」は Asset のメニューに対して「Agent Configuration」を追加する定型文である。
6行目「public class AgentConfiguration : ScriptableObject」については別途記事をまとめているためこちらを参照してほしい。
それ以降については、保持するデータをグローバル変数として定義しているのみであるため、解説は省略させていただく。
2.エージェント編 – エージェント用ゲームオブジェクトを作成する
『次に、エージェントのゲームオブジェクトを作成します。』
とのことなので指示通り「エージェントのゲームオブジェクト」を作成していく。チュートリアルの手順では以下の通りとなっている。
- 空のゲームオブジェクトを作成します。
- このゲームオブジェクトを NewAgent と名付けます。
- このゲームオブジェクトに HitscanLauncher または BallisticLauncher を追加します。詳細はhttps://unity3d.com/learn/tutorials/puroziekutos/tower-defense-template/targeting-and-firingを参照してください。
- このゲームオブジェクトに AttackingAgent コンポーネントか FlyingAgent コンポーネントを加えます。
- Ememy (SimpleAlignment) スクリプタブルオブジェクトを Alignment フィールドにドラッグします。
- モデルを加え、エージェントゲームオブジェクトの子オブジェクトとしてエージェントを可視化します。
- エージェントの空の子ゲームオブジェクトを作成し、それを Targetable と名付けます。このオブジェクトによって、タワーはエージェントを有効な攻撃目標と認識します。
- Hierarchy ウィンドウでエージェントを選択して、Targetable を AttackingAgent コンポーネントの Target Transform フィールドにドラッグアンドドロップします。
上記の指示通り空の GameObject に対して「NewAgent 」という名称を付け、BallisticLauncher と AttackingAgent コンポーネントを追加した。その後、Ememy (SimpleAlignment) スクリプタブルオブジェクトを Alignment フィールド にドラッグした。また、モデルにつてはチュートリアルに付属している Hoverbuggy の Prefab を参考に設定を行った。すべての手順が完了すると以下の通りとなった。
HitscanLauncher と BallisticLauncher の違い
BallisticLauncher は弾道計算を行うランチャーを定義する際に使用する。イメージとしては大砲などがイメージに近いと思われる。
HitscanLauncher は弾道が存在しないランチャーを定義する際に使用する。レーザービームのような一直線に進むものがイメージに近いと思われる。
AttackingAgent と FlyingAgent の違い
AttackingAgent 目標に到達するまでに障害があればそれを破壊しながら進むエージェントを定義する際に使用する。戦車などがイメージに近いと思われる。
FlyingAgent 目標に到達するまでに障害があってもそれを無視しながら進むエージェントを定義する際に使用する。ヘリや戦闘機などがイメージに近いと思われる。
※ 注意
この時点ではすべての設定が完了していないためエラーが発生する。
その後、『NavMeshAgent コンポーネントは、AttackingAgent または FlyingAgent コンポーネントの追加時に自動的に加えられます。NavMeshAgent コンポーネントは、エージェントをレベルで移動させるために必要です。NavMeshAgent コンポーネントで定義された値は、移動の仕方を指定します。
タワーの場合と同様に、エージェントは AttackingAgent または FlyingAgent コンポーネントを単にゲームオブジェクトにアタッチするだけでは定義されません。エージェントが必要な動作を行うためには、他のコンポーネントが必要です。
- 適切な Collider コンポーネントを加えて、エージェントのモデルを NewAgent ゲームオブジェクトに加えます。
Collider コンポーネントは、エージェントが砲撃に当たったかどうかを判断するために必要です。
- DamageCollider コンポーネントを NewAgent ゲームオブジェクトに加えます。』
とのことなので、Hoverbuggy の Prefab を参考に Collider には カプセル Collider を使用し、NewAgent に対して DamageCollider を追加する。
今回新たに出てきた AttackingAgent と FlyingAgent については改めて解説させていただくことにする。また、 HitscanLauncher と BallisticLauncher は『標的設定と砲撃』について進める際に合わせて解説させていただきたいと思う。
DamageCollider については以前に解説を行ったためこちらの記事を参照してほしい。