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.
Thử thách
Trung bìnhHã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.
- Trong
Health, hoàn thiệnTakeDamage(int amount): trừMathf.Max(amount - armor, 1)khỏihp. - Ghi nhật ký
name + " hp: " + hp, ví dụDummy hp: 2. - Khi
hp <= 0, gọiDestroy(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
1Rigidbody
Trọng lực và khối lượngĐẩy bằng AddForceNhảy bằng xung lựcFixedUpdate cho vật lýVận tốcVật thể động họcÔn tập: Bệ phóng4Coroutine
InvokeInvokeRepeating, CancelInvokeCoroutine đầu tiên của bạnVòng lặp trong CoroutineDừng CoroutineÔn tập: đếm ngược10Dự án: Thoát khỏi đấu trường
Đấu trườngThợ săn2Va chạm
OnCollisionEnterMình đã va chạm với gì?Vỡ khi va chạmĐứng trên mặt đấtĐộ nảy và ma sátHình dạng colliderÔn tập: Tường có thể phá vỡ5Dự án: Cuộc đua thu thập xu
Quả bóng lănThu thập xuTự luyện tập: Playground Unity