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.
Desafio
MédioFragmentos de gelo desaceleram os inimigos por um tempo.
- Em
TowerData, adicionepublic float slowFactor = 1f;epublic float slowDuration;(FrostData: 0.5 e 2). - Em
Enemy,public void Slow(float factor, float duration)mantém o fator eslowUntil = Time.time + duration; mova-se adata.speedvezes o fator enquantoTime.time < slowUntil. - Em
Projectile, após o dano, quandodata.slowDuration > 0e o alvo tiver umEnemy, 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);
}
}
}
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
3Estratégia
Dados da TorrePratique por conta própria: Playground de Unity