前文:https://blog.csdn.net/jaihk662/article/category/8688031(UGUI)
实现效果在这~:
第一步:制作代表血条的UI
除了LayerNum,其它全部都是图片(Image)
对于所有的“血条”图片,设置如下:
最后效果如下:
两条技巧:
- 当你做完一套小UI时,建议拖成预制体
- 对于同一层的UI,例如上面的三张血条图片,排位在前面的图片会被排外在后面的图片遮挡,也就是排位=深度,除此之外,父物体一定会被其子物体遮挡,所以可以通过调整UI在Hierarchy面板中的位置来调整UI的层数
第二步:编写血条主逻辑
直接上代码,代码中有注释(脚本拖到血条父物体"PlayerBlood"上)
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class MainHp : MonoBehaviour
{
private Text picNum;
private Transform myTran;
private Image pic1, pic2, pic3; //因为样例只有三个血条,所以这里可以直接定义三个字段
private List<Image> bloodList = new List<Image>(); //用于管理每一层的血条
private int whichPic; //到了第几个血条
private float hitPoint, selfPoint, temp;
void Start()
{
myTran = this.GetComponent<Transform>();
pic1 = myTran.Find("Layer1").GetComponent<Image>();
pic2 = myTran.Find("Layer2").GetComponent<Image>();
pic3 = myTran.Find("Layer3").GetComponent<Image>();
picNum = myTran.Find("LayerNum").GetComponent<Text>();
bloodList.Add(pic3);
bloodList.Add(pic2);
bloodList.Add(pic1);
whichPic = 0;
hitPoint = 1200; //血量上限
temp = selfPoint = hitPoint / 3; //每一条血量值
picNum.text = "x" + (3 - whichPic);
}
void BeenHit(float now) //参数now为角色受到的伤害
{
if (whichPic == 2 && now >= selfPoint) //如果只剩下一管血,并且当前伤害足以致命
{
selfPoint = 0;
bloodList[whichPic].fillAmount = 0;
picNum.text = "Sorry";
return;
}
while (now > temp) //防止伤害过高,一击打穿多管血量
{
now -= temp;
bloodList[whichPic++].fillAmount = 0; //简单代码逻辑,稍微会写点程序的都能看懂,这些就不讲了。。。
picNum.text = "x" + (3 - whichPic);
if (whichPic == 2 && now >= selfPoint)
{
selfPoint = 0;
bloodList[whichPic].fillAmount = 0;
return;
}
}
if (now < selfPoint)
{
selfPoint -= now;
bloodList[whichPic].fillAmount = selfPoint / temp;
}
else
{
bloodList[whichPic++].fillAmount = 0;
selfPoint = temp - (now - selfPoint);
picNum.text = "x" + (3 - whichPic);
bloodList[whichPic].fillAmount = selfPoint / temp;
}
}
}
第三部:血条与角色交互
上面的代码因为已经将“扣血”封装成了方法,所以只需要角色绑定血条,当其受到伤害时调用方法即可
一个例子如下
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerMechine : MonoBehaviour
{
//……
void OnTriggerEnter(Collider coll)
{
if (coll.tag == "Monster1Killer" && isDied==false)
{
myAnimator.SetTrigger("Damage");
hp -= 20;
myBlood.SendMessage("BeenHit", 20);
if (hp <= 0)
isDied = true;
}
}
}
搞定!