血条
本课属于 Coddy Unity 学习旅程的“打造真正的游戏”单元。第 10 课,共 60 课。
会逐渐变空的条形显示是一个 UI Image,它的 Image Type 设置为 Filled。Image 设置了 Source Image 后才会出现这个选项;如果为 None,Inspector 就会将其隐藏。将 Fill Method 设为 Horizontal,并将 Fill Origin 设为 Left,条形就会朝左端缩短。fillAmount 的取值范围是 0 到 1,表示绘制条形的比例。在它后面放一个深色 Image,就能显示空的部分。Unity 会限制 fillAmount 的取值,因此 1.4 会绘制完整的条形,-0.2 则会绘制空条形。
fillAmount 表示剩余生命值占最大生命值的比例。使用 int 字段时,除法会进行整数除法,因此 350 / 500 的结果是 0,所以要先将一边转换为 float。Image 位于 UnityEngine.UI 中。这个 Boss 血条会在每次受到攻击后更新:
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
}血条的颜色也可以随生命值变化:bossBar.color = Color.Lerp(Color.red, Color.green, bossBar.fillAmount); 血条满时为绿色,随着血条变空会逐渐变红。
挑战
简单用两个条形显示骑士的护盾和生命值。
- 编写
ShowBars():shieldBar.fillAmount = (float)shield / maxShield;,并对healthBar使用hp和maxHp做同样的处理。在Start()中调用它。 - 在
TakeDamage中,护盾承受Mathf.Min(amount, shield)的伤害,剩余伤害从hp中扣除,且hp不会低于 0。然后调用ShowBars()。
按“运行”,然后走到尖刺上:护盾条会先清空。然后点击“检查”。
亲手试试
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;
// 填满两个进度条
}
public void TakeDamage(int amount)
{
// 护盾尽可能承受伤害;剩余伤害从 hp 中扣除,最低降到 0。然后显示两个进度条。
}
}
打造真正的游戏中的所有课
自己练习: Unity 在线编辑器