Đóng băng
Bài học 21 trên 25 trong khóa học Game Unity: thủ thành của Coddy.
Tháp Băng gần như không gây sát thương, nhưng những mảnh băng của nó làm chậm kẻ địch trong một khoảng thời gian. Làm chậm là trạng thái của một kẻ địch và trạng thái này có thời hạn: kẻ địch lưu hệ số làm chậm cùng thời điểm hiệu ứng kết thúc, rồi tính tốc độ của mình ở mỗi khung hình dựa trên tốc độ trong dữ liệu của nó. Khi Time.time chưa đến thời điểm kết thúc, hệ số sẽ được áp dụng; sau đó, kẻ địch trở lại tốc độ tối đa mà không cần khôi phục gì cả. Một chiếc xe đua trên bệ tăng tốc:
public void Boost(float multiplier, float seconds)
{
boost = multiplier;
boostUntil = Time.time + seconds;
}float speed = data.topSpeed;
if (Time.time < boostUntil)
{
speed *= boost;
}Không bao giờ ghi hiệu ứng làm chậm vào dữ liệu của đối tượng. data.speed *= 0.5f sẽ làm chậm mọi kẻ địch cùng loại, kể cả những kẻ chưa xuất hiện, và sẽ không có gì khôi phục tốc độ. Nếu một mảnh băng thứ hai trúng kẻ địch đang bị làm chậm, hệ số và thời điểm kết thúc sẽ được đặt lại, vì vậy hiệu ứng làm chậm kéo dài chừng nào tháp Băng còn tiếp tục bắn trúng, nhưng không mạnh thêm.
Thử thách
Trung bìnhMảnh băng làm chậm kẻ địch trong một lúc.
- Trong
TowerData, thêmpublic float slowFactor = 1f;vàpublic float slowDuration;(FrostData: 0.5 và 2). - Trong
Enemy,public void Slow(float factor, float duration)lưu hệ số vàslowUntil = Time.time + duration; di chuyển với tốc độ bằngdata.speednhân với hệ số đó khiTime.time < slowUntil. - Trong
Projectile, sau khi gây sát thương, khidata.slowDuration > 0và mục tiêu cóEnemy, hãy làm chậm mục tiêu.
Nhấn Chơi với tháp Frost trước khi đặt tháp Arrows: Grunt bị đóng băng di chuyển với nửa tốc độ. Sau đó nhấn Kiểm tra.
Tự làm thử
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);
}
}
}
Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.
Tất cả bài học trong Game Unity: thủ thành
Tự luyện tập: Playground Unity