Es
Pelajaran 21 dari 25 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
SedangPecahan es memperlambat musuh selama beberapa saat.
- Di
TowerData, tambahkanpublic float slowFactor = 1f;danpublic float slowDuration;(FrostData: 0.5 dan 2). - Di
Enemy,public void Slow(float factor, float duration)menyimpan faktor danslowUntil = Time.time + duration; bergerak dengan kecepatandata.speeddikalikan faktor selamaTime.time < slowUntil. - Di
Projectile, setelah memberikan kerusakan, jikadata.slowDuration > 0dan target memilikiEnemy, perlambat target.
Tekan tombol “Main” dengan menara Frost sebelum menara Arrows-mu: Grunt yang terkena Frost berjalan dengan setengah kecepatan. Lalu tekan tombol “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.
Semua pelajaran di Game Unity: Tower Defense
Latihan sendiri: Playground Unity