Menu
CoddyTech

Данные о противниках

Урок 2 из 18 курса Игра в Unity: защита башен на Coddy.

В игре в жанре tower defense есть разные виды врагов: пехотинцы, быстрые бегуны, медленные танки. Все пехотинцы ходят с одинаковой скоростью и начинают с одинаковым запасом здоровья, поэтому эти значения относятся к виду, а не к отдельному врагу. Они хранятся в ресурсе 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;
    }
}

Все машины одной модели используют один и тот же CarData, а каждая расходует собственное fuel. Если вместо этого написать data.tankSize -= used, бак всех машин этой модели опустеет одновременно, а в редакторе изменение останется в ресурсе и после нажатия Play. Awake выполняется сразу после создания объекта, поэтому копия будет готова до того, как её можно будет использовать.

challenge icon

Задание

Легко

К Громиле присоединяется Бегун: он быстрее, но у него меньше здоровья. Создай отдельный ресурс для каждого вида.

  1. В EnemyData.cs сделай так, чтобы EnemyData можно было создавать через меню Create с названием меню Tower Defense/Enemy Data, и добавь в него открытые поля speed (тип float), maxHealth и reward (тип int).
  2. В Enemy.cs замени поле speed открытым полем data типа EnemyData и перемещай врага со скоростью data.speed.
  3. Добавь закрытое целочисленное поле health и присвой ему значение maxHealth ресурса в Awake.

В проекте есть ресурсы GruntData (скорость 2, здоровье 9, награда 5) и RunnerData (скорость 3.5, здоровье 5, награда 3), а в Inspector каждому врагу назначен свой ресурс. Нажми Play и посмотри, как Бегун обгоняет Громилу, затем нажми Check.

Попробуйте сами

using UnityEngine;

// Будет позже: характеристики одного типа врага в виде ресурса.
public class EnemyData : ScriptableObject
{
}
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Игра в Unity: защита башен