Menu
CoddyTech

Buz

Coddy'nin Unity Oyunu: Kule Savunması kursunda ders 21 / 25.

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

Buz parçaları düşmanları bir süre yavaşlatır.

  1. TowerData içinde public float slowFactor = 1f; ve public float slowDuration; ekle (FrostData: 0.5 ve 2).
  2. Enemy içinde public void Slow(float factor, float duration) faktörü saklar ve slowUntil = Time.time + duration değerini ayarlar; Time.time < slowUntil iken data.speed ile faktörün çarpımı hızında yürü.
  3. Projectile içinde, hasardan sonra, data.slowDuration > 0 olduğunda ve hedef bir Enemy olduğunda onu yavaşlat.

Oklar’dan önce bir Frost kulesiyle “Oyna”: buz tutmuş Grunt’lar yarı hızda yürür. Ardından “Kontrol et”.

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

Kendi başına pratik yap: Unity playground