Unity チュートリアルのタワーディフェンステンプレートを触ってみる(14)
Unity チュートリアルのタワーディフェンステンプレートを触ってみる(13)では AttackingAgent と FlyingAgent について解説を行った。これで「エージェント編」は一通り完了したことになる。今回から「標的設定と砲撃編」を進めていく。
1.標的設定と砲撃編 – 概要
Unity チュートリアルのタワーディフェンステンプレートを触ってみる(2)で述べた通り、Unity のチュートリアルに沿って作業を進めていく。ということで次に標的設定と砲撃について進めていく。
Unity 公式ページの「標的設定と砲撃」についてはこちらを参照してほしい。
『前のセクションでは、エージェントとタワーを作成する方法についての概要を説明しましたが、エージェントとタワーを互いに攻撃させる方法についてはまだ実際に説明していません。これは主に、敵とタワーの両方に同じコンポーネントとプロセスが必要であるためです。このセクションでそれらを説明します。』
2.標的設定と砲撃編 – 砲弾を作成する
『エージェントとタワーを砲撃できるようにするには、互いに攻撃するための砲弾を作る必要があります。ダメージの程度は、タワーまたはエージェント自体ではなく、砲弾のプロパティーに含まれます。』とのことなので指示に従って砲弾の作成を進める。基本的な作成方法は以下の通りだが、砲弾の種類によって作り方が異なるとのこと。
- 空のゲームオブジェクトを作成し、タワー/エージェントのタイプ、単語 projectile、必要な場合は関連するレベル (LaserTowerProjectile_1 など) で構成される名前を付けます。
- 新しい砲弾のゲームオブジェクトに Damager コンポーネントを加えます。
- 攻撃がヒットしたときにタワーやエージェントから奪われる耐久力の量を表す Damage フィールドを設定します。
- タワーの砲弾の場合は Player (SimpleAlignment) スクリプタブルオブジェクトを Alignment フィールドにドラッグします。エージェントの場合は、Enemy (SimpleAlignment) スクリプタブルオブジェクトを Alignment フィールドにドラッグします。
『これからの手順は、どのような種類の砲弾を作るかによります。 弾道や衝突の検出に依存しないヒットスキャンの砲弾の場合は以下の通りです。』
- 砲弾ゲームオブジェクトに HitscanAttack コンポーネントを加えます。
- Delay フィールドに任意の秒数を設定します。
『ロケットなどの砲弾では、砲弾がオブジェクトと衝突したかどうか、そして、衝突した位置を確認してダメージを決定します。』
- 砲弾ゲームオブジェクトに BallisticProjectile コンポーネントを加えます。
- 砲弾ゲームオブジェクトに RigidBody と CapsuleCollider コンポーネントを追加して、砲弾と環境の衝突を確実に検出できるようにします。
- ContactDestroyer コンポーネントを追加すると、衝突後に砲弾は破棄されます。
『砲弾がより広い半径でダメージを与える場合は、次の手順を行います。』
- 砲弾ゲームオブジェクトに SplashDamager コンポーネントを加えます。
- Attack Range フィールドに効果を及ぼす範囲の半径を設定します。
- Damage Amount フィールドの値を、砲弾が直接あたらなかった場合にエージェント/タワーが受けるダメージの量に設定します。
今回は Prefab にある LaserTowerProjectile_0 を参考にレーザー用のゲームオブジェクトを作成した。本来の LaserTowerProjectile_0 では Poolable コンポーネントも付随しているのだが、今回は上記の指示通り Damager と HitscanAttack コンポーネントのみ適応している。Poolable については章を進める中で出てきたときに改めて解説させていただく。
Damager については「Assets/Scripts/ActionGameFramework/Health/Damager.cs」をドラッグアンドドロップして使用している。
HitscanAttack については「Assets/Scripts/TowerDefense/Towers/Projectiles/HitscanAttack.cs」をドラッグアンドドロップして使用している。
このときの各パラメータについては LaserTowerProjectile_0 の Prefab を参考に Damager では以下の通り。
- Damage : 12
- Chance To Spawn Collision Prefab : 1
- Collision Particles : 「Assets/Particles/Prefabs/LaserImpactPFX」
- Alignment : 「Assets/Data/Alignments/Player」
また、HitscanAttack についても同様に以下の通りとした
- Delay : 0.25
3.タワーに標的設定を加える
『以下の手順では、タワーとエージェントの両方の標的設定が可能になります。スターターキットでは、タワーの AttackAffector に別の子ゲームオブジェクトを使いますが、コンポーネントはエージェントのプレハブにアタッチされます。純粋に整理方法上の違いであり、AttackAffector の機能は変わりません。』とのことなので、以下の指示に従いタワーに対して AttackAffector コンポーネントを追加していきたいと思う。
- タワーレベル/エージェントプレハブの空の子ゲームオブジェクトを作成し、Affector という名前を付けます。このオブジェクトによって、タワーとエージェントが互いに攻撃できるようになります。
- Affector ゲームオブジェクトに適当な Launcher コンポーネントを加えます。
- Affector ゲームオブジェクトに AttackAffector コンポーネントを加えます。
- 砲弾のプレハブを Projectile フィールドにドラッグアンドドロップします。
- タワー/エージェントが砲弾を発射する地点として Projectile Points を追加します。
- タワー/エージェントの Fire Rate (砲撃頻度) を設定します。
- Tower レベルまたは Agent プレハブの子として空のゲームオブジェクトを作成し、「Targetter」という名前にします。次に Targetter コンポーネントをゲームオブジェクトに適用します。このオブジェクトを作ると、タワーが砲撃するエージェントを見つけられるようになります。
- タワーレベルの砲台の Transform を Turret フィールドにドラッグアンドドロップします。砲台として設定されたオブジェクトは、エージェントを標的にします。
- タワーレベルの Search Rate (検索頻度) を設定します。
- タワーレベルの Targetter Collider を Sphere (スフィア) または Capsule (カプセル) に設定します。
- Radius と Vertical Range のフィールドを設定します。
- Hierarchy ウィンドウで Affector ゲームオブジェクトを選択して、Targetter ゲームオブジェクトを AttackAffector コンポーネントの Tower Targetter フィールドにドラッグアンドドロップします。
- タワープレハブに変更を適用します。
『上記の手順によって、エージェントが、プレイヤー本拠地への経路を妨害するタワーに向かって武器を発射できるようになります。エージェントがプレイヤーの本拠地にダメージを与えられるようにするには、以下の手順を行います。』
- エージェントプレハブに HomeBaseAttacker を加えます。
- エージェントが本拠地に達する場合に、攻撃する前に充填に必要な秒数を設定します。
まずは Affector について進めていく。その際、 Prefab にある LaserTower_0 を参考にタワー用のゲームオブジェクトを改良した。自作した LayserTower_0 に対して空のゲームオブジェクトを Affector として追加し、そのゲームオブジェクトに HitscanLancher と AttackAffector を追加している。それぞれのコンポーネントは「Assets/Scripts/TowerDefense/Towers/TowerLaunchers/HitscanLauncher.cs」と「Assets/Scripts/TowerDefense/Affectors/AttackAffector.cs」を使用している。
HitscanLancher の各パラメータについては Prefab を参考に以下の通りとした。
- Fire Particle System : Prefab に登録されている LayserTower_0 から LaserFireEffect を取り出しパラメータとした
また、AttackAffector の各パラメータについては Prefab を参考に以下の通りとした。
- 説明 : 「Offensive」
- Projectile : 「Assets/Prefabs/Towers/Laser/LaserProjectile_0」
- Projectile Points(サイズ) : 1
- Projectile Points(サイズ) : 空のゲームオブジェクトを LaserTower_TURRET_L01 の下に 「ProjectilePoint」という名前で作成し作成しトランスフォームの位置に x : 0.03853759、y : -0.041、z : 1.052 とした
- Epicenter : 自作した LayserTower_0
- Fire Rate : 0.3
- Random Audio Source : HitscanLancher のパラメータに使用した LaserFireEffect
- Tower Targgetter : 次に作成する Targgetter
次には Targgetter について進めていく。その際、 Prefab にある LaserTower_0 を参考にタワー用のゲームオブジェクトを改良した。自作した LayserTower_0 に対して空のゲームオブジェクトを Targgetter として追加し、そのゲームオブジェクトに Targgetter を追加している。コンポーネントは「Assets/Scripts/TowerDefense/Targetting/Targetter.cs」を使用している。
Targgetter の各パラメータについては Prefab を参考に以下の通りとした。
- Turret : 自作した LayserTower_0 の「LaserTower_TURRET_L01」ゲームオブジェクト
- Turrt X Totation Range : x : 0、y : 0
- Only Y TurretRotation : チェックを入れる
- Search Rate : 1
- Idle Rotation Speed : 39
- Idle Correction Time : 2
- Attached Collider : Targgeter ゲームオブジェクト
- Idle Wait Time : 2
- Targetter Collider : カプセル
- Radius : 12
- Vertical Range : 4
今回、出てきたスクリプトについては次回以降改めて解説させていただく。
Assets/Scripts/ActionGameFramework/Health/Damager.cs について、稚拙ながら解説させていただいた。記事については以下を参照してほしい。
Damager
Assets/Scripts/TowerDefense/Towers/Projectiles/HitscanAttack.cs について、稚拙ながら解説させていただいた。記事については以下を参照してほしい。
HitscanAttack
Assets/Scripts/TowerDefense/Affectors/AttackAffector.cs および、継承関係、インタフェースの Affector.cs 、ITowerRadiusProvider について稚拙ながら解説させていただいた。それぞれの記事については以下を参照してほしい。
Affector
ITowerRadiusProvider
AttackAffector
Assets/Scripts/TowerDefense/Towers/TowerLaunchers/HitscanLauncher.cs および、継承関係の Launcher.cs について稚拙ながら解説させていただいた。それぞれの記事については以下を参照してほしい。
Launcher
ILauncher
HitscanLauncher
Assets/Scripts/TowerDefense/Targetting/Targetter.cs および、継承関係の Targetter.cs について稚拙ながら解説させていただいた。記事については以下を参照してほしい。
Targetter