Menu
CoddyTech

Congelamento

Lição 21 de 25 do curso Jogo de Unity: Defesa de Torres da Coddy.

A torre Frost quase não causa dano, mas seus fragmentos desaceleram um inimigo por um tempo. A lentidão é um estado de um inimigo e tem um fim: o inimigo mantém o fator e o momento em que a lentidão termina, e calcula sua velocidade a cada quadro com base na velocidade do seu asset. Enquanto Time.time estiver antes do fim, o fator se aplica; depois disso, o inimigo volta à velocidade máxima sem que seja necessário desfazer nada. Um carro de corrida em uma plataforma de impulso:

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

A lentidão nunca deve ser gravada no asset. data.speed *= 0.5f desaceleraria todos os inimigos daquele tipo, inclusive os que ainda não foram gerados, e nada faria a velocidade voltar. Se um segundo fragmento atingir um inimigo desacelerado, ele define o fator e o momento de término novamente, então a lentidão dura enquanto a torre Frost continuar acertando o inimigo, sem ficar mais forte.

challenge icon

Desafio

Médio

Fragmentos de gelo desaceleram os inimigos por um tempo.

  1. Em TowerData, adicione public float slowFactor = 1f; e public float slowDuration; (FrostData: 0.5 e 2).
  2. Em Enemy, public void Slow(float factor, float duration) mantém o fator e slowUntil = Time.time + duration; mova-se a data.speed vezes o fator enquanto Time.time < slowUntil.
  3. Em Projectile, após o dano, quando data.slowDuration > 0 e o alvo tiver um Enemy, desacelere-o.

Pressione “Jogar” com uma torre Frost antes das suas Arrows: Grunts congelados andam com metade da velocidade. Em seguida, pressione “Verificar”.

Experimente você mesmo

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 iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Jogo de Unity: Defesa de Torres

Pratique por conta própria: Playground de Unity