Данные о противниках
Урок 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 выполняется сразу после создания объекта, поэтому копия будет готова до того, как её можно будет использовать.
Задание
ЛегкоК Громиле присоединяется Бегун: он быстрее, но у него меньше здоровья. Создай отдельный ресурс для каждого вида.
- В
EnemyData.csсделай так, чтобы EnemyData можно было создавать через меню Create с названием менюTower Defense/Enemy Data, и добавь в него открытые поляspeed(тип float),maxHealthиreward(тип int). - В
Enemy.csзамени полеspeedоткрытым полемdataтипа EnemyData и перемещай врага со скоростьюdata.speed. - Добавь закрытое целочисленное поле
healthи присвой ему значениеmaxHealthресурса вAwake.
В проекте есть ресурсы GruntData (скорость 2, здоровье 9, награда 5) и RunnerData (скорость 3.5, здоровье 5, награда 3), а в Inspector каждому врагу назначен свой ресурс. Нажми Play и посмотри, как Бегун обгоняет Громилу, затем нажми Check.
Попробуйте сами
using UnityEngine;
// Будет позже: характеристики одного типа врага в виде ресурса.
public class EnemyData : ScriptableObject
{
}
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.