Menu
CoddyTech

Phần thưởng

Bài học 13 trên 25 trong khóa học Game Unity: thủ thành của Coddy.

Mỗi kẻ địch bị tháp hạ gục sẽ mang lại reward. Enemy báo tin bị hạ gục giống như khi báo đã đến căn cứ, bằng một sự kiện tĩnh, Killed, rồi GameManager lắng nghe sự kiện và cộng tiền.

Mỗi lần hạ gục chỉ được trả thưởng một lần. Destroy không xóa đối tượng ngay lập tức: việc đó diễn ra vào cuối khung hình, và trước lúc đó, đối tượng vẫn còn trong trò chơi. Hai phát bắn có thể trúng trong cùng một khung hình, và phát thứ hai trúng kẻ địch vẫn còn đó với 0 máu. Nếu TakeDamage báo hạ gục mỗi khi máu bằng hoặc dưới 0, phát thứ hai sẽ trả thưởng lần nữa. Trò chơi bắn bóng bằng phi tiêu cũng gặp vấn đề tương tự, và một biến bool sẽ ngăn việc này:

public void Pop()
{
    if (popped)
    {
        return;
    }

    popped = true;
    Popped?.Invoke(this);
    Destroy(gameObject);
}

Kẻ địch không cần thêm biến bool, vì máu của nó đã cho biết nó có chết hay chưa: TakeDamage không cần làm gì nếu thấy máu bằng hoặc dưới 0.

challenge icon

Thử thách

Trung bình

Mỗi lần hạ gục kẻ địch sẽ nhận được tiền thưởng của kẻ địch đó.

  1. Trong Enemy, thêm public static event Action<Enemy> Killed; và kích hoạt sự kiện này trong TakeDamage ngay trước khi kẻ địch bị hủy.
  2. Bắt đầu TakeDamage bằng if (health <= 0) return;, để mỗi lần hạ gục chỉ nhận thưởng một lần.
  3. Trong GameManager, thêm public void Earn(int amount) (cộng tiền và hiển thị số tiền đó), rồi đăng ký lắng nghe Enemy.Killed để nhận enemy.data.reward.

Nhấn Chơi: số tiền tăng lên khi các tháp hoạt động. 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 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)
    {
        health -= amount;
        if (health <= 0)
        {
            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