Menu
CoddyTech

Đó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.

challenge icon

Thử thách

Trung bình

Mảnh băng làm chậm kẻ địch trong một lúc.

  1. Trong TowerData, thêm public float slowFactor = 1f; và public float slowDuration; (FrostData: 0.5 và 2).
  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ằng data.speed nhân với hệ số đó khi Time.time < slowUntil.
  3. Trong Projectile, sau khi gây sát thương, khi data.slowDuration > 0 và 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);
        }
    }
}
quiz iconTự kiểm tra

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