Menu
CoddyTech

Битва с боссом

Часть раздела Архитектура игр в Unity путешествия по Unity на Coddy. Урок 50 из 50.

Каменный голем охраняет выход из арены. Он топает в вашу сторону, а когда вы подходите близко, на секунду поднимает кулаки и ударяет по земле, нанося вам урон, если вы всё ещё рядом. После удара он отдыхает, и только тогда ваш меч может ранить его: его каменная кожа отражает каждый удар, пока он идёт или готовится к атаке. По его цвету видно, что он делает: серый — идёт, красный — готовится к атаке, бирюзовый — отдыхает. Снизьте его здоровье до 0 — и ворота откроются. Полоска вверху экрана отображает каждый удар.

Напишите мозг голема в виде машины состояний, создав класс для каждого состояния: Boss, а также ChaseState, WindupState и RestState в BossStates.cs. Игрок, полоска здоровья, ворота, IState, StateMachine и IDamageable уже готовы.

challenge icon

Задание

Сложно

В 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;
    }
}
quiz iconПроверьте себя

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

Все уроки раздела Архитектура игр в Unity