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.
Sfida
MedioI frammenti di ghiaccio rallentano i nemici per un po'.
- In
TowerData, aggiungipublic float slowFactor = 1f;epublic float slowDuration;(FrostData: 0.5 e 2). - In
Enemy,public void Slow(float factor, float duration)conserva il fattore eslowUntil = Time.time + duration; fai muovere i nemici adata.speedmoltiplicata per il fattore mentreTime.time < slowUntil. - In
Projectile, dopo aver inflitto i danni, quandodata.slowDuration > 0e il bersaglio ha un componenteEnemy, 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);
}
}
}
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