Es
Pelajaran 15 dari 18 dalam kursus Game Unity: Tower Defense di Coddy.
Menara Frost hampir tidak memberi kerusakan, tetapi serpihannya memperlambat musuh untuk sementara. Perlambatan adalah kondisi satu musuh, dan kondisi ini memiliki batas waktu: musuh menyimpan faktor dan waktu berakhirnya perlambatan, lalu menghitung kecepatannya setiap frame berdasarkan kecepatan asetnya. Selama Time.time masih sebelum waktu berakhir, faktor tersebut berlaku; setelahnya, musuh kembali ke kecepatan penuh tanpa perlu memulihkan apa pun. Mobil balap yang berada di atas bantalan pendorong:
public void Boost(float multiplier, float seconds)
{
boost = multiplier;
boostUntil = Time.time + seconds;
}float speed = data.topSpeed;
if (Time.time < boostUntil)
{
speed *= boost;
}Perlambatan tidak boleh diterapkan pada aset. data.speed *= 0.5f akan memperlambat semua musuh dari jenis itu, termasuk yang belum muncul, dan kecepatannya tidak akan pernah dipulihkan. Serpihan kedua yang mengenai musuh yang sudah melambat akan mengatur faktor dan waktu berakhirnya lagi, sehingga perlambatan berlangsung selama menara Frost terus menyerang, tetapi efeknya tidak semakin kuat.
Tantangan
Sedang- Di
TowerData, tambahkan float publikslowFactor(nilai default 1: tidak memperlambat) danslowDuration(nilai default 0). FrostData menetapkan nilai 0.5 dan 2. - Di
Enemy, tambahkanpublic void Slow(float factor, float duration), yang menyimpan factor dan waktu berakhirnya efek perlambatan. Setiap frame, musuh bergerak dengan kecepatan asset-nya dikalikan factor selama efek perlambatan berlangsung. - Di
Projectile, setelah memberikan damage, jikaslowDurationpada data lebih dari 0 dan target adalah Enemy, perlambat target dengan factor dan duration dari data.
Tower Frost tersedia di shop, bersama asset FrostData dan projectile FrostShard. Tekan Mainkan, tempatkan tower Frost di depan tower Arrows-mu, lalu tekan Periksa.
Coba sendiri
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);
}
}
}
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.