Битва с боссом
Часть раздела Архитектура игр в Unity путешествия по Unity на Coddy. Урок 50 из 50.
Каменный голем охраняет выход из арены. Он топает в вашу сторону, а когда вы подходите близко, на секунду поднимает кулаки и ударяет по земле, нанося вам урон, если вы всё ещё рядом. После удара он отдыхает, и только тогда ваш меч может ранить его: его каменная кожа отражает каждый удар, пока он идёт или готовится к атаке. По его цвету видно, что он делает: серый — идёт, красный — готовится к атаке, бирюзовый — отдыхает. Снизьте его здоровье до 0 — и ворота откроются. Полоска вверху экрана отображает каждый удар.
Напишите мозг голема в виде машины состояний, создав класс для каждого состояния: Boss, а также ChaseState, WindupState и RestState в BossStates.cs. Игрок, полоска здоровья, ворота, IState, StateMachine и IDamageable уже готовы.
Задание
СложноВ Inspector для Boss задаются player, speed (2), slamRange (2.5), windupTime (1), restTime (2), slamDamage (2) и maxHealth (6), а его UnityEvent onDefeated связывается с Open Gate. PlayerDistance() и Tint(color) уже готовы.
BossреализуетIDamageable. ВAwakeон задаёт здоровье равнымmaxHealth, создаётStateMachineи три состояния, хранящиеся в общедоступных поляхmachine,chase,windupиrest(конструктор каждого состояния получает босса). ВStartон вызывает событиеHealthChanged, передавая текущее здоровье иmaxHealth, и начинает с состоянияchase; каждый кадр он обновляет машину состояний.ChaseState: окрашивает голема вColor.grayи ведёт его по земле к игроку со скоростьюspeed. Когда игрок оказывается в пределахslamRange, состояние переключается на подготовку к удару.WindupState: окрашивает голема вColor.red, и он стоит неподвижно в течениеwindupTimeсекунд. Затем выводит в журналSlam!, наносит игрокуslamDamageурона через егоIDamageable, если игрок всё ещё находится в пределахslamRange, и переключается на состояние отдыха.RestState: окрашивает голема вColor.cyanи ждётrestTimeсекунд, затем переключается обратно в состояние преследования. Каждая подготовка к удару и каждый отдых длятся полное отведённое время.TakeDamageучитывает урон только пока голем находится в состоянии отдыха и ещё стоит на ногах: вычитает полученное количество из здоровья и вызывает событиеHealthChanged. При 0 здоровья он выводит в журналThe golem falls, вызываетonDefeatedи деактивирует себя.
Нажми Play, уклоняйся от ударов и атакуй, пока голем отдыхает, затем нажми Check.
Попробуйте сами
using System;
using UnityEngine;
using UnityEngine.Events;
public class Boss : MonoBehaviour
{
public Transform player;
public float speed = 2f;
public float slamRange = 2.5f;
public float windupTime = 1f;
public float restTime = 2f;
public int slamDamage = 2;
public int maxHealth = 6;
public event Action<int, int> HealthChanged;
public UnityEvent onDefeated;
// Расстояние до игрока по поверхности земли.
public float PlayerDistance()
{
Vector3 d = player.position - transform.position;
d.y = 0f;
return d.magnitude;
}
// Серый, когда он движется; красный, когда готовится к атаке; голубой, когда отдыхает.
public void Tint(Color color)
{
GetComponent<Renderer>().material.color = color;
}
}
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Архитектура игр в Unity
1Компоненты, а не иерархии
Небольшие компонентыБазовый скрипт врагаАбстрактные компонентыСовместная работа компонентовПовторение: модульная турель4Сериализованные данные
Сериализуемые классыСписки в InspectorПеречисления в InspectorПовторение: таблица лута2Интерфейсы в Unity
IDamageableИнтерфейсы и TryGetComponentGetComponentsПовторение: клавиша взаимодействия5ScriptableObjects
Ресурсы данныхХарактеристики оружияОбщие настройкиВолны как данныеПовторение: база предметов