Menu
CoddyTech

Gelo

Lezione 21 di 25 del corso Gioco Unity: Tower Defense di Coddy.

La torre Frost infligge appena danni, ma i suoi frammenti rallentano un nemico per un po'. Un rallentamento è uno stato di un singolo nemico e ha una scadenza: il nemico conserva il fattore e il momento in cui il rallentamento termina, e calcola la propria velocità a ogni frame a partire dalla velocità del suo asset. Finché Time.time è inferiore alla scadenza, si applica il fattore; dopodiché il nemico torna alla velocità massima senza che ci sia nulla da annullare. Un'auto da corsa su una piattaforma acceleratrice:

public void Boost(float multiplier, float seconds)
{
    boost = multiplier;
    boostUntil = Time.time + seconds;
}
float speed = data.topSpeed;
if (Time.time < boostUntil)
{
    speed *= boost;
}

Il rallentamento non deve mai essere scritto nell'asset. data.speed *= 0.5f rallenterebbe tutti i nemici di quel tipo, compresi quelli non ancora generati, e nulla ripristinerebbe mai la velocità. Un secondo frammento che colpisce un nemico già rallentato imposta di nuovo il fattore e la scadenza, quindi il rallentamento dura finché la torre Frost continua a colpire, senza diventare più intenso.

challenge icon

Sfida

Medio

I frammenti di ghiaccio rallentano i nemici per un po'.

  1. In TowerData, aggiungi public float slowFactor = 1f; e public float slowDuration; (FrostData: 0.5 e 2).
  2. In Enemy, public void Slow(float factor, float duration) conserva il fattore e slowUntil = Time.time + duration; fai muovere i nemici a data.speed moltiplicata per il fattore mentre Time.time < slowUntil.
  3. In Projectile, dopo aver inflitto i danni, quando data.slowDuration > 0 e il bersaglio ha un componente Enemy, rallentalo.

Premi «Gioca» con una torre Frost prima delle tue torri Arrows: i Grunt congelati camminano a metà velocità. Poi premi «Verifica».

Provalo tu

using System;
using System.Collections.Generic;
using UnityEngine;

public class Enemy : MonoBehaviour, IDamageable
{
    public static readonly List<Enemy> All = new List<Enemy>();
    public static event Action<Enemy> ReachedBase;
    public static event Action<Enemy> Killed;

    public EnemyData data;
    public Transform[] waypoints;

    private int next = 1;
    private int health;

    void Awake()
    {
        health = data.maxHealth;
    }

    void OnEnable()
    {
        All.Add(this);
    }

    void OnDisable()
    {
        All.Remove(this);
    }

    void Update()
    {
        Vector3 target = waypoints[next].position;
        transform.position = Vector3.MoveTowards(transform.position, target, data.speed * Time.deltaTime);
        if (transform.position == target)
        {
            next++;
            if (next == waypoints.Length)
            {
                ReachedBase?.Invoke(this);
                Destroy(gameObject);
            }
        }
    }

    public void TakeDamage(int amount)
    {
        if (health <= 0)
        {
            return;
        }

        health -= amount;
        if (health <= 0)
        {
            Killed?.Invoke(this);
            Destroy(gameObject);
        }
    }
}
quiz iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Gioco Unity: Tower Defense

Esercitati da solo: Playground Unity