Menu
CoddyTech

Máu và sát thương

Thuộc phần Vật lý và lối chơi trong hành trình Unity của Coddy. Bài học 55 trên 71.

Hệ thống sát thương cần hai script. Script Health gắn với mọi thứ có thể bị tổn thương và quản lý điểm máu của chúng, còn thứ gây sát thương sẽ tìm script đó và gọi một phương thức trên đó. Đây là script Health của một chiếc thùng vỡ sau ba lần trúng đòn, và script của những chiếc gai gây sát thương cho bất cứ thứ gì rơi xuống chúng:

public class Health : MonoBehaviour
{
    [SerializeField] private int hp = 3;

    public void TakeDamage(int amount)
    {
        hp -= amount;
        if (hp <= 0)
        {
            Destroy(gameObject);
        }
    }
}
public class Spikes : MonoBehaviour
{
    void OnCollisionEnter(Collision collision)
    {
        Health health = collision.gameObject.GetComponent<Health>();
        if (health != null)
        {
            health.TakeDamage(1);
        }
    }
}

TakeDamage là public, nên các script khác có thể gọi nó, và đây là đoạn code duy nhất thay đổi hp. Gai, đạn và dung nham đều gọi cùng một phương thức, còn riêng script Health quyết định ý nghĩa của giá trị 0: phá hủy chiếc thùng, kết thúc trò chơi hoặc phát hoạt ảnh chết. Mỗi script nằm trong một tệp riêng, được đặt tên theo lớp của nó.

GetComponent<Health>() trả về null nếu đối tượng không có Health, chẳng hạn như sàn nhà, nên gai kiểm tra trước khi gọi. TryGetComponent(out Health health) tra cứu và kiểm tra chỉ trong một lần gọi: hàm trả về true và điền giá trị cho health chỉ khi có Health.

challenge icon

Thử thách

Trung bình

Hãy khiến mỗi phát bắn đều có tác dụng. Bullet đã sẵn sàng và gọi TakeDamage(2) lên vật mà nó bắn trúng.

  1. Trong Health, hoàn thiện TakeDamage(int amount): trừ Mathf.Max(amount - armor, 1) khỏi hp.
  2. Ghi nhật ký name + " hp: " + hp, ví dụ Dummy hp: 2.
  3. Khi hp <= 0, gọi Destroy(gameObject);.

Nhấn Chơi rồi bắn hình nộm hai lần: nhật ký hiển thị Dummy hp: 2, sau đó hình nộm biến mất. Tiếp theo, nhấn Kiểm tra.

Tự làm thử

using UnityEngine;

public class Health : MonoBehaviour
{
    [SerializeField] private int hp = 4;
    [SerializeField] private int armor = 0;

    public void TakeDamage(int amount)
    {
        // Trừ máu bằng amount trừ armor (ít nhất 1), ghi log lượng máu còn lại, hủy đối tượng khi máu về 0
    }
}

Tất cả bài học trong Vật lý và lối chơi

Tự luyện tập: Playground Unity