敵のデータ
Coddyの「Unityゲーム:タワーディフェンス」コースのレッスン 2/18。
タワーディフェンスゲームには、雑魚敵、素早いランナー、動きの遅いタンクなど、さまざまな種類の敵がいます。雑魚敵はどれも同じ速度で歩き、同じ体力で開始するため、これらの数値は個々の敵ではなく種類に属します。これらは種類ごとに1つずつScriptableObjectアセットに格納し、その種類の敵はすべてそのアセットを参照します。アセットを変更すると、その種類の敵はすべて一緒に変わります。
アセットに個々の敵の状態を保持させてはいけません。攻撃を受けた雑魚敵は、後ろにいる雑魚敵より体力が少なくなっているため、アセットには雑魚敵が開始時に持つ体力であるmaxHealthを格納し、各敵はそれを自分自身のフィールドにコピーします。レースゲームでは、車も同じように分けます。
[CreateAssetMenu(fileName = "NewCar", menuName = "Racing/Car Data")]
public class CarData : ScriptableObject
{
public float topSpeed = 30f;
public float tankSize = 50f;
}
public class Car : MonoBehaviour
{
public CarData data;
private float fuel;
void Awake()
{
fuel = data.tankSize;
}
}同じモデルの車はすべて1つのCarDataを共有し、それぞれが独自のfuelを消費します。代わりにdata.tankSize -= usedと記述すると、そのモデルのすべての車のタンクが一度に空になり、EditorではPlay後も変更がアセットに残ります。Awakeはオブジェクトが作成されるとすぐに実行されるため、何かが使う前にコピーが準備されます。
チャレンジ
簡単Runner が Grunt に加わります。より速く、体力は少なめです。それぞれの種類に専用のアセットを用意しましょう。
EnemyData.csで、EnemyData を Create メニューから作成できるようにし、メニュー名をTower Defense/Enemy Dataに設定して、public フィールドspeed(float)、maxHealthとreward(int)を追加します。Enemy.csで、speedフィールドを EnemyData 型の public フィールドdataに置き換え、data.speedの速度で移動させます。- private int
healthを追加し、AwakeでアセットのmaxHealthを設定します。
プロジェクトには GruntData アセット(速度 2、体力 9、報酬 5)と RunnerData アセット(速度 3.5、体力 5、報酬 3)があり、Inspector で各敵にそれぞれのアセットを割り当てます。Play を押して Runner が Grunt を追い越すのを確認し、それから Check を押します。
自分で試してみよう
using UnityEngine;
// 後で登場:敵の種類ごとのステータスをアセットとして表したもの。
public class EnemyData : ScriptableObject
{
}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。