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.
Görev
OrtaBuz parçaları düşmanları bir süre yavaşlatır.
TowerDataiçindepublic float slowFactor = 1f;vepublic float slowDuration;ekle (FrostData: 0.5 ve 2).Enemyiçindepublic void Slow(float factor, float duration)faktörü saklar veslowUntil = Time.time + durationdeğerini ayarlar;Time.time < slowUntilikendata.speedile faktörün çarpımı hızında yürü.Projectileiçinde, hasardan sonra,data.slowDuration > 0olduğunda ve hedef birEnemyolduğ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);
}
}
}
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