- 制作动态血条首先要先制作一个血条的预制体,其中应包括掉血UI、暴击、闪避等,为了美观还可给他们加上动画组件,根据自己的项目而定。
- 制作好预制体后,就是在加载人物或敌人时通过代码给他们动态加载上。(本案例包括动画组件的播放)
- 给预制体单独增加一个脚本,方便以后的管理
下面是代码,也不难理解,产生掉血、暴击、闪避等效果时,直接调用这里面的函数即可
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class EntityHP : MonoBehaviour
{
#region UI Define
public Image imgHPGray;
public Image imgHPRed;
public Animation criticalAni;
public Text txtCritical;
public Animation dodgeAni;
public Text txtDodge;
public Animation hpAni;
public Text txtHp;
#endregion
int targetHP = 0;
int currHP = 0;
private RectTransform rect;
private Transform rootTrans;
private int hpVal;
private float scaleRate = 1.0F * Constants.ScreenStandardHeight / Screen.height;
private void Update()
{
Vector3 screenPos = Camera.main.WorldToScreenPoint(rootTrans.position);
rect.position = screenPos * scaleRate;
imgHPGray.fillAmount = currPrg;
UpdateCurrHP();
}
private void UpdateCurrHP()
{
if (Mathf.Abs(currPrg - targetPrg) < 1)
{
currPrg = targetPrg;
}
else if (currPrg > targetPrg)
{
currPrg -= Constants.AccelerHPSpeed * Time.deltaTime;
}
else
{
currPrg += Constants.AccelerHPSpeed * Time.deltaTime;
}
}
public void Init(Transform trans, int hp)
{
rect = transform.GetComponent<RectTransform>();
rootTrans = trans;
currHP=targetHP = hpVal = hp;
imgHPGray.fillAmount = 1;
imgHPRed.fillAmount = 1;
}
public void SetDodge()
{
dodgeAni.Stop();
txtDodge.text = "闪避";
dodgeAni.Play();
}
public void SetCritical(int critical)
{
criticalAni.Stop();
txtCritical.text = critical.ToString();
currHP = targetHP;
targetHP -= critical;
SetHPVal(currHP, targetHP);
criticalAni.Play();
}
public void SetHurt(int hurt)
{
hpAni.Stop();
txtHp.text = hurt.ToString();
currHP = targetHP;
targetHP -= hurt;
SetHPVal(currHP,targetHP);
hpAni.Play();
}
private float currPrg;
private float targetPrg;
private void SetHPVal(int oldVal, int nowVal)
{
currPrg = 1.0f * oldVal / hpVal;
targetPrg = 1.0f * nowVal / hpVal;
imgHPRed.fillAmount = targetPrg;
}
}