1.创建UI滑块
画布设置
填满滑块
将背景和填充都设置为同时设置位置
2.实现实体翻转时血条不翻转
Entity脚本:
public System.Action onFlipped;//事件订阅系统,即给onFlipped订阅一个功能
if(onFlipped!=null)//Flip()函数中
{
onFlipped();
}
HealthBar_UI脚本:
private Entity entity;//获取实体脚本
private RectTransform myTransform;//获取血条的transform组件
private void Start()
{
entity = GetComponentInParent<Entity>();
myTransform = GetComponent<RectTransform>();
entity.onFlipped += FlipUI;//订阅事件
}
private void FlipUI()
{
myTransform.Rotate(0,180,0);//旋转
}
3.实现血条随血量更新
CharactorState脚本:
public System.Action onHealthChange;//订阅血条变化事件,目的是只有在受伤时调用血条变化
currentHealth = GetMaxHealth();//Start()中
if(ingitedDamageTimer<0&&isInigted)//Update中
{
Debug.Log("take the ingitedamage" + ingitedDamage);
DecreaseHealth(ingitedDamage);//削减血条的函数
if(currentHealth < 0)
{
Die();
}
ingitedDamageTimer = ingitedDamageCooldown;
}
DecreaseHealth(_damage);//TakeDamage()中
protected virtual void DecreaseHealth(int _damage)//调用上面的事件
{
currentHealth -= _damage;
if(onHealthChange != null)
{
onHealthChange();
}
}
public int GetMaxHealth()//获取最大生命值
{
return maxHealth.GetValue()+valitity.GetValue()*5;//等于基础生命值加上活力属性*5
}
HealthBar_UI脚本:
private Entity entity;
private RectTransform myTransform;
private CharactorState mystate;//获取实体的状态脚本
private Slider slider;//获取滑块
private void Start()
{
entity = GetComponentInParent<Entity>();
myTransform = GetComponent<RectTransform>();
slider = GetComponentInChildren<Slider>();
mystate =GetComponentInParent<CharactorState>();
entity.onFlipped += FlipUI;
mystate.onHealthChange += UpdateHealthUI;//订阅事件
UpdateHealthUI();
}
private void UpdateHealthUI()//更新函数
{
slider.maxValue = mystate.GetMaxHealth();
slider.value = mystate.currentHealth;
}
private void FlipUI()=> myTransform.Rotate(0, 180, 0);
private void OnDisable()//结束时取消所有订阅
{
entity.onFlipped -= FlipUI;
mystate.onHealthChange -= UpdateHealthUI;
}