Menu
CoddyTech

敵のデータ

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はオブジェクトが作成されるとすぐに実行されるため、何かが使う前にコピーが準備されます。

challenge icon

チャレンジ

簡単

Runner が Grunt に加わります。より速く、体力は少なめです。それぞれの種類に専用のアセットを用意しましょう。

  1. EnemyData.cs で、EnemyData を Create メニューから作成できるようにし、メニュー名を Tower Defense/Enemy Data に設定して、public フィールド speed(float)、maxHealth と reward(int)を追加します。
  2. Enemy.cs で、speed フィールドを EnemyData 型の public フィールド data に置き換え、data.speed の速度で移動させます。
  3. 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
{
}
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

Unityゲーム:タワーディフェンスのすべてのレッスン