Menu
CoddyTech

Buz

Coddy'nin Unity Oyunu: Kule Savunması kursunda ders 15 / 18.

Buz kulesi pek hasar vermez, ancak parçaları bir düşmanı bir süre yavaşlatır. Yavaşlama, tek bir düşmanın durumudur ve bir bitiş noktası vardır: düşman çarpanı ve yavaşlamanın sona ereceği zamanı saklar, ardından her karede varlığının hızını temel alarak hızını hesaplar. Time.time bitiş zamanından önceyken çarpan uygulanır; sonrasında düşman tam hızına döner ve geri alınması gereken bir değişiklik kalmaz. Hızlandırma pedindeki bir yarış arabası:

public void Boost(float multiplier, float seconds)
{
    boost = multiplier;
    boostUntil = Time.time + seconds;
}
float speed = data.topSpeed;
if (Time.time < boostUntil)
{
    speed *= boost;
}

Yavaşlama asla varlığa yazılmamalıdır. data.speed *= 0.5f aynı türden tüm düşmanları yavaşlatırdı; henüz doğmamış olanları bile ve hızı eski hâline getirecek hiçbir şey olmazdı. Yavaşlamış bir düşmana isabet eden ikinci bir parça çarpanı ve bitiş zamanını yeniden ayarlar; böylece Buz kulesi vurmaya devam ettiği sürece yavaşlama sürer ve etkisi daha da güçlenmez.

challenge icon

Görev

Orta
  1. TowerData içinde, herkese açık slowFactor (varsayılan 1: yavaşlatma yok) ve slowDuration (varsayılan 0) float değişkenlerini ekleyin. FrostData için değerleri 0.5 ve 2 olarak ayarlayın.
  2. Enemy içine, çarpanı ve yavaşlatmanın sona erdiği zamanı tutan public void Slow(float factor, float duration) metodunu ekleyin. Yavaşlatma sürdüğü sürece düşman, her karede kendi varlığının hızında çarpanla çarpılmış şekilde yürür.
  3. Projectile içinde, hasardan sonra, verinin slowDuration değeri 0'dan büyükse ve hedef bir Enemy içeriyorsa, verinin çarpanı ve süresiyle onu yavaşlatın.

Frost kulesi, FrostData varlığı ve FrostShard mermisiyle birlikte dükkândadır. Play'e basın, Arrows kulelerinizin önüne bir Frost kulesi yerleştirin, ardından Check'e basın.

Kendin dene

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 iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Unity Oyunu: Kule Savunması bölümündeki tüm dersler