Frost
Lektion 21 von 25 im Kurs Unity-Spiel: Tower Defense von Coddy.
Der Frostturm richtet kaum Schaden an, aber seine Splitter verlangsamen einen Gegner eine Weile. Eine Verlangsamung ist ein Zustand eines einzelnen Gegners und hat ein Ende: Der Gegner speichert den Faktor und den Zeitpunkt, zu dem die Verlangsamung abläuft, und berechnet seine Geschwindigkeit in jedem Frame anhand der Geschwindigkeit seines Assets. Solange Time.time vor dem Ablaufzeitpunkt liegt, gilt der Faktor; danach ist der Gegner wieder mit voller Geschwindigkeit unterwegs, und es gibt nichts rückgängig zu machen. Ein Rennwagen auf einem Boost-Pad:
public void Boost(float multiplier, float seconds)
{
boost = multiplier;
boostUntil = Time.time + seconds;
}float speed = data.topSpeed;
if (Time.time < boostUntil)
{
speed *= boost;
}Die Verlangsamung darf niemals in das Asset geschrieben werden. data.speed *= 0.5f würde jeden Gegner dieses Typs verlangsamen, auch die, die noch nicht gespawnt sind, und nichts würde die Geschwindigkeit jemals wiederherstellen. Ein zweiter Splitter, der einen bereits verlangsamten Gegner trifft, setzt den Faktor und den Ablaufzeitpunkt erneut, sodass die Verlangsamung anhält, solange der Frostturm weiter trifft, aber nicht stärker wird.
Aufgabe
MittelFrostsplitter verlangsamen Gegner für eine Weile.
- Füge in
TowerDatapublic float slowFactor = 1f;undpublic float slowDuration;hinzu (FrostData: 0.5 und 2). - In
Enemyspeichertpublic void Slow(float factor, float duration)den Faktor undslowUntil = Time.time + duration; bewege dich mitdata.speedmultipliziert mit dem Faktor, solangeTime.time < slowUntilgilt. - Verlangsame in
Projectiledas Ziel nach dem Schaden, wenndata.slowDuration > 0gilt und das Ziel einEnemyist.
Klicke auf „Spielen“, bevor du deine Pfeiltürme platzierst, und baue einen Frostturm: Eingefrorene Grunts laufen mit halber Geschwindigkeit. Klicke dann auf „Prüfen“.
Probier es selbst
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);
}
}
}
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Unity-Spiel: Tower Defense
Übe selbstständig: Unity-Playground