Menu
CoddyTech

Frost

Lektion 15 von 18 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.

challenge icon

Aufgabe

Mittel
  1. Füge in TowerData die öffentlichen Floats slowFactor (Standardwert 1: keine Verlangsamung) und slowDuration (Standardwert 0) hinzu. FrostData setzt die Werte auf 0.5 und 2.
  2. Füge in Enemy die Methode public void Slow(float factor, float duration) hinzu, die den Faktor und den Zeitpunkt speichert, zu dem die Verlangsamung endet. Während die Verlangsamung anhält, bewegt sich der Gegner in jedem Frame mit der Geschwindigkeit seines Assets multipliziert mit dem Faktor.
  3. Verlangsame in Projectile nach dem Schaden das Ziel mit dem Faktor und der Dauer aus den Daten, wenn slowDuration der Daten größer als 0 ist und das Ziel ein Enemy ist.

Der Frostturm ist im Shop, zusammen mit seinem FrostData-Asset und seinem FrostShard-Projektil. Drücke Play, platziere einen Frostturm vor deinen Arrows und klicke dann auf Check.

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);
        }
    }
}
quiz iconTeste dich selbst

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