Menu
CoddyTech

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.

challenge icon

Aufgabe

Mittel

Frostsplitter verlangsamen Gegner für eine Weile.

  1. Füge in TowerData public float slowFactor = 1f; und public float slowDuration; hinzu (FrostData: 0.5 und 2).
  2. In Enemy speichert public void Slow(float factor, float duration) den Faktor und slowUntil = Time.time + duration; bewege dich mit data.speed multipliziert mit dem Faktor, solange Time.time < slowUntil gilt.
  3. Verlangsame in Projectile das Ziel nach dem Schaden, wenn data.slowDuration > 0 gilt und das Ziel ein Enemy ist.

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);
        }
    }
}
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

Übe selbstständig: Unity-Playground