Thanh máu
Thuộc phần Xây dựng trò chơi thực tế trong hành trình Unity của Coddy. Bài học 10 trên 60.
Một thanh vơi dần là một ảnh giao diện có Image Type được đặt thành Filled. Tùy chọn này xuất hiện khi ảnh có Source Image; nếu là None, Inspector sẽ ẩn tùy chọn đó. Fill Method Horizontal với Fill Origin Left làm thanh co về phía đầu bên trái, còn fillAmount, từ 0 đến 1, cho biết phần thanh được vẽ. Một ảnh tối phía sau hiển thị phần còn trống. Unity giới hạn fillAmount, vì vậy giá trị 1.4 vẫn vẽ thanh đầy, còn -0.2 vẽ thanh trống.
fillAmount là phần máu còn lại, tức máu hiện tại chia cho mức tối đa. Với các trường int, phép chia sẽ cho kết quả là số nguyên, nên 350 / 500 bằng 0. Vì vậy, trước tiên hãy ép kiểu một vế sang float. Image nằm trong UnityEngine.UI. Thanh máu của boss này được cập nhật sau mỗi lần trúng đòn:
public Image bossBar;
public int bossMaxHp = 500;
private int bossHp = 500;
public void Hit(int damage)
{
bossHp = Mathf.Max(bossHp - damage, 0);
bossBar.fillAmount = (float)bossHp / bossMaxHp; // 350 / 500 = 0.7
}Màu của thanh cũng có thể thay đổi theo lượng máu: bossBar.color = Color.Lerp(Color.red, Color.green, bossBar.fillAmount); thanh có màu xanh lá khi đầy và chuyển dần sang đỏ khi vơi đi.
Thử thách
DễHiển thị khiên và máu của hiệp sĩ trên hai thanh.
- Viết
ShowBars():shieldBar.fillAmount = (float)shield / maxShield;, và làm tương tự vớihealthBarbằnghpvàmaxHp. Gọi hàm này trongStart(). - Trong
TakeDamage, khiên chịuMathf.Min(amount, shield)sát thương, phần còn lại trừ vàohp, nhưng không để máu giảm xuống dưới 0. Sau đó gọiShowBars().
Nhấn Chơi rồi đi lên gai: thanh khiên sẽ cạn trước. Sau đó nhấn Kiểm tra.
Tự làm thử
using UnityEngine;
using UnityEngine.UI;
public class Knight : MonoBehaviour
{
public Image healthBar;
public Image shieldBar;
public int maxHp = 80;
public int maxShield = 40;
private int hp;
private int shield;
void Start()
{
hp = maxHp;
shield = maxShield;
// Lấp đầy cả hai thanh
}
public void TakeDamage(int amount)
{
// Khiên hấp thụ sát thương tối đa có thể; phần còn lại trừ vào hp, nhưng không thấp hơn 0. Sau đó, cập nhật cả hai thanh.
}
}
Tất cả bài học trong Xây dựng trò chơi thực tế
1Văn bản trên màn hình
Canvas và văn bảnHiển thị điểm sốĐịnh dạng sốĐồng hồ đếm ngượcÔn tập: Đồng hồ tốc độ7Điều khiển thời gian
Tạm dừng bằng timeScaleChuyển động chậmThời gian không bị co giãnÔn tập: Bullet Time2Nút bấm và màn hình
Nút bấm và onClickLambdaKết nối trong InspectorBật và tắt bảngThanh máuÔn tập: Cửa hàng nâng cấp5Lưu dữ liệu với PlayerPrefs
Lưu một sốTải với giá trị mặc địnhĐiểm cao nhấtLưu cài đặtÔn tập: Tiền xu trong ngân hàngTự luyện tập: Playground Unity