Menu
CoddyTech

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.

challenge icon

Wyzwanie

Średni

Odłamki lodu na pewien czas spowalniają wrogów.

  1. W TowerData dodaj public float slowFactor = 1f; i public float slowDuration; (FrostData: 0.5 i 2).
  2. W Enemy metoda public void Slow(float factor, float duration) zapamiętuje współczynnik oraz slowUntil = Time.time + duration; poruszaj się z prędkością data.speed pomnożoną przez współczynnik, gdy Time.time < slowUntil.
  3. W Projectile, po zadaniu obrażeń, gdy data.slowDuration > 0 i cel jest obiektem typu Enemy, 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);
        }
    }
}
quiz iconSprawdź się

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