许多常见的RPG等游戏中,玩家操控的角色都有“健康值”这一属性,也被通俗叫做“血条”。当玩家的角色受到伤害时,会损失一定的健康值并反映到血条上来。我们的飞船同样也需要这样一个用户界面来反映当前的健康状态。当飞船撞击到太空中不可收集的物体时,如卫星、行星等,就会损失生命值,并且发出闪烁的灯光预警。
一般来说,血条可能在每个游戏角色正上方、跟随角色移动,比如大多数PvP游戏。也可能只显示第一视角控制角色的健康值,固定在屏幕上的某个位置。甚至还有环形、水平、竖直等不同位置。
(Unity Asset Store中的健康条样例)
为了节省我们手动绘制、设计用户界面的时间,我们依然去往Unity Asset Store寻找合适(且免费)的健康值系统UI。
-
打开Unity Asset Store,搜索:Health Bar或者类似关键词
最后我选择了这个风格的血条:Simple Heart Health System | GUI Tools | Unity Asset Store:可以逐个降低生命值
-
加入购物车后,选择“在Unity中打开”
-
在Unity编辑器中下载(Download)、导入(Import)
现在,你的资产栏中应该出现了一个叫做“HealthHeartSystem”的文件夹,双击打开后,就会出现如下内容:
这个文件本身有自己预设的使用方式,可能会更加简便。但我们为了自己完成所有流程,本次只使用他的图像。感兴趣的同学可以通过阅读readme和他的代码文件来了解如何使用。
双击打开Graphics文件夹,发现其中包括红色(Mini-heart_0)和灰色(Mini-heart_1)的心,且两个的属性都为Sprite,自然而然的想到可以将它们作为源图像放置到UI中的Image上。
-
选中场景栏中的Canvas,右键建立新的UI – Panel,重命名为Health Panel
-
这个Panel用来显示生命值,方便我们统一移动、修改
-
-
调整大小和位置,可以将它放在UI的左上角
-
在Health Panel中选择新建UI – Image在Unity编辑器中下载(Download)、导入(Import)
-
每个Image代表一个心的占位符
-
-
同样调整大小和位置。
-
点击Image,将资源栏中Mini-heart_0图片拖拽到Source Image那一栏中,图片就会变成红心的样子啦
(Source Image = mini-heart_0)
-
同样的方式,复制几个心形,来作为血条
(最终场景栏的结构与UI)
创建好基本的健康条后,开始进行“碰撞后掉血”这一操作。每当飞船与无法被收集的物体碰撞时,都会将一个红心image变灰。
这里涉及到三步:
-
碰撞探测OnCollisionEnter
-
比较碰撞物体
-
修改Source Image的sprite
-
新建Script,命名为Health,双击打开
-
首先导入UI这个workspace
using UnityEngine.UI;
-
创建公开变量:
-
Image[]:用来存放所有的红心
-
Sprite:来保存灰心(损失生命值后)的图片
-
public Image[] hearts;
public Sprite gray;
-
首先进行碰撞探测,并比较物体的tag是否属于Moon 或 Other
-
否则,撞到垃圾也会导致生命降低
-
void OnCollisionEnter(Collision other)
{
if (other.gameObject.CompareTag("Moon") || other.gameObject.CompareTag("Other"))
{
}
}
-
如果符合条件,就将心形图像由红色改为灰色。
-
由于hearts存储在list中,我们需要通过一个额外的变量来得到改变哪一个心形。这个值一开始为最大健康值。
-
public int health; // 记录健康值
-
当物体碰撞时,健康值会减1,心形列表将会从末尾端开始依次变灰。
health -=1;
hearts[health].sprite = gray;
-
一旦健康值等于零,游戏就会结束:
If (health==0){
Application.Quit();
}
-
保存并返回编辑器。将Health拖拽到飞船上,并赋予相应的值
-
要注意health的值要保证与用户界面上心形的数量相等。
-
-
不要忘记创建Other和Moon的tag,赋予给场景中相应的物体。
点击运行,当飞船碰撞到卫星、行星等物体时,用户界面上的红心就会变黑啦。当损失掉最后一点生命值后,游戏就结束了!
如果有任何疑问或者建议,欢迎在下方留言评论哟~