Menu
CoddyTech

Combat de boss

Fait partie de la section Architecture de jeu dans Unity du Journey Unity de Coddy. Leçon 64 sur 64.

Un golem de pierre garde la porte qui mène hors de l’arène. Il avance vers toi en martelant le sol et, quand tu t’approches, il lève les poings pendant une seconde, puis frappe le sol, ce qui te blesse si tu es encore à proximité. Après un coup, il se repose, et c’est seulement alors que ton épée peut lui faire mal : sa peau de pierre repousse tous les coups lorsqu’il marche ou se prépare à frapper. Sa couleur indique ce qu’il fait : gris lorsqu’il marche, rouge lorsqu’il se prépare à frapper, cyan lorsqu’il se repose. Réduis sa santé à 0 et la porte s’ouvre. La barre en haut de l’écran suit chaque coup.

Écris le cerveau du golem sous la forme d’une machine à états, avec une classe pour chaque état : Boss, ainsi que ChaseState, WindupState et RestState dans BossStates.cs. Le joueur, la barre de santé, la porte, IState, StateMachine et IDamageable sont prêts, et Boss crée déjà ses états et met à jour la machine à chaque étape.

challenge icon

Défi

Difficile

Écris les états du golem dans BossStates.cs.

  1. ChaseState : Tint(Color.gray) ; marche vers le joueur à la vitesse speed ; à portée de slamRange, prépare son attaque.
  2. WindupState : Tint(Color.red) ; après windupTime, affiche Slam!, inflige slamDamage à un joueur à portée, puis se repose.
  3. RestState : Tint(Color.cyan) ; après restTime, poursuit le joueur.
  4. Boss.TakeDamage ne compte les dégâts que pendant rest : soustrais le montant, déclenche HealthChanged, puis appelle Fall() à 0.

Appuie sur « Jouer » et frappe-le pendant qu’il se repose. Puis clique sur « Vérifier ».

Essayez vous-même

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)
    {
        // Les coups ne comptent que lorsqu’il se repose : soustraire amount, déclencher HealthChanged, appeler Fall() à 0
    }

    // Prêt : le golem tombe, la porte s’ouvre et le golem quitte l’arène.
    void Fall()
    {
        Debug.Log("The golem falls");
        onDefeated.Invoke();
        gameObject.SetActive(false);
    }

    // Distance du joueur, mesurée au sol.
    public float PlayerDistance()
    {
        Vector3 d = player.position - transform.position;
        d.y = 0f;
        return d.magnitude;
    }

    // Gris lorsqu’il marche, rouge lorsqu’il prépare son attaque, cyan lorsqu’il se repose.
    public void Tint(Color color)
    {
        GetComponent<Renderer>().material.color = color;
    }
}
quiz iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de Architecture de jeu dans Unity

Entraînez-vous par vous-même : Playground Unity