Mróz
Lekcja 21 z 25 w kursie Gra w Unity: Obrona wieży w Coddy.
Wieża Mrozu zadaje niewielkie obrażenia, ale jej odłamki na jakiś czas spowalniają wroga. Spowolnienie to stan pojedynczego wroga i ma swój koniec: wróg przechowuje współczynnik oraz czas, w którym spowolnienie przestaje działać, a w każdej klatce oblicza swoją prędkość na podstawie prędkości z zasobu. Dopóki Time.time jest mniejsze od czasu końca, obowiązuje współczynnik; po jego upływie wróg odzyskuje pełną prędkość i nie trzeba niczego cofać. Samochód wyścigowy na polu przyspieszenia:
public void Boost(float multiplier, float seconds)
{
boost = multiplier;
boostUntil = Time.time + seconds;
}float speed = data.topSpeed;
if (Time.time < boostUntil)
{
speed *= boost;
}Spowolnienia nigdy nie należy zapisywać w zasobie. data.speed *= 0.5f spowolniłoby wszystkich wrogów tego rodzaju, także tych, którzy nie zostali jeszcze przywołani, a prędkość nigdy nie zostałaby przywrócona. Jeśli drugi odłamek trafi spowolnionego wroga, ponownie ustawia współczynnik i czas końca, więc spowolnienie trwa, dopóki wieża Mrozu trafia wroga, ale nie staje się silniejsze.
Wyzwanie
ŚredniOdłamki lodu na pewien czas spowalniają wrogów.
- W
TowerDatadodajpublic float slowFactor = 1f;ipublic float slowDuration;(FrostData: 0.5 i 2). - W
Enemymetodapublic void Slow(float factor, float duration)zapamiętuje współczynnik orazslowUntil = Time.time + duration; poruszaj się z prędkościądata.speedpomnożoną przez współczynnik, gdyTime.time < slowUntil. - W
Projectile, po zadaniu obrażeń, gdydata.slowDuration > 0i cel jest obiektem typuEnemy, spowolnij go.
Naciśnij „Graj” z wieżą Frost przed swoimi wieżami Arrows: oszronieni Grunts poruszają się z połową prędkości. Następnie naciśnij „Sprawdź”.
Spróbuj swoich sił
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);
}
}
}
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Gra w Unity: Obrona wieży
Poćwicz samodzielnie: Edytor online Unity