Walka z bossem
Część sekcji Architektura gier w Unity ścieżki Unity w Coddy. Lekcja 64 z 64.
Kamienny golem strzeże bramy prowadzącej poza arenę. Zbliża się do ciebie, a gdy podejdziesz blisko, na sekundę unosi pięści i uderza nimi o ziemię, zadając ci obrażenia, jeśli nadal jesteś w pobliżu. Po uderzeniu odpoczywa i dopiero wtedy twój miecz może go zranić: jego kamienna skóra z łatwością odpiera każde uderzenie, gdy chodzi lub przygotowuje się do ataku. Jego kolor pokazuje, co robi: szary, gdy chodzi, czerwony, gdy przygotowuje się do ataku, cyjanowy, gdy odpoczywa. Zmniejsz jego zdrowie do 0, a brama się otworzy. Pasek u góry ekranu odzwierciedla każde uderzenie.
Napisz mózg golema jako maszynę stanów z osobną klasą dla każdego stanu: Boss oraz ChaseState, WindupState i RestState w pliku BossStates.cs. Gracz, pasek zdrowia, brama, IState, StateMachine i IDamageable są już gotowe, a Boss już tworzy swoje stany i wykonuje aktualizację maszyny.
Wyzwanie
TrudnyNapisz stany golema w pliku BossStates.cs.
ChaseState:Tint(Color.gray); idź w stronę gracza z prędkościąspeed; gdy znajdziesz się w zasięguslamRange, przygotuj się do ataku.WindupState:Tint(Color.red); po upływiewindupTimewyświetl komunikatSlam!, zadaj obrażenia graczowi w zasięgu równeslamDamage, a następnie odpocznij.RestState:Tint(Color.cyan); po upływierestTimerusz w pościg.Boss.TakeDamageprzyjmuje obrażenia tylko w stanierest: odejmij otrzymaną wartość, wywołaj zdarzenieHealthChanged, a przy 0 wywołajFall().
Naciśnij „Graj” i atakuj, gdy golem odpoczywa. Następnie naciśnij „Sprawdź”.
Spróbuj swoich sił
using System;
using UnityEngine;
using UnityEngine.Events;
public class Boss : MonoBehaviour, IDamageable
{
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 StateMachine machine;
public IState chase;
public IState windup;
public IState rest;
private int health;
void Awake()
{
health = maxHealth;
machine = new StateMachine();
chase = new ChaseState(this);
windup = new WindupState(this);
rest = new RestState(this);
}
void Start()
{
HealthChanged?.Invoke(health, maxHealth);
machine.ChangeState(chase);
}
void Update()
{
machine.Tick();
}
public void TakeDamage(int amount)
{
// Uderzenia liczą się tylko podczas odpoczynku: odejmij amount, wywołaj HealthChanged, a przy 0 wywołaj Fall()
}
// Gotowe: golem upada, brama się otwiera, a golem opuszcza arenę.
void Fall()
{
Debug.Log("The golem falls");
onDefeated.Invoke();
gameObject.SetActive(false);
}
// Odległość gracza mierzona po ziemi.
public float PlayerDistance()
{
Vector3 d = player.position - transform.position;
d.y = 0f;
return d.magnitude;
}
// Szary, gdy chodzi, czerwony, gdy szykuje się do ataku, cyjanowy, gdy odpoczywa.
public void Tint(Color color)
{
GetComponent<Renderer>().material.color = color;
}
}
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Architektura gier w Unity
1Komponenty, nie hierarchie
Małe komponentyBazowy skrypt przeciwnikaKomponenty abstrakcyjneWspółpracujące komponentyPowtórka: modułowa wieżyczkaPowtórka: podwójne działo4Dane serializowane
Klasy serializowalneListy w InspectorzeEnumy w InspectorzePodsumowanie: tabela łupówPodsumowanie: losowanie łupów2Interfejsy w Unity
IDamageableInterfejsy i TryGetComponentGetComponentsPowtórka: klawisz interakcjiPowtórka: najbliższy w zasięgu5ScriptableObjects
Zasoby danychStatystyki broniWspółdzielone ustawieniaOcal wiatrFale jako danePowtórka: Baza przedmiotówPowtórka: Kupowanie w sklepie8Kod wielokrotnego użytku
Metody rozszerzająceGeneryczny singletonGeneryczne metody pomocniczePodsumowanie: FindNearestPoćwicz samodzielnie: Edytor online Unity