糖尿病康复,内容丰富有趣,生活中的好帮手!
糖尿病康复 > 【Unity】一个使用Dorween实现的血量条显示与血量变化

【Unity】一个使用Dorween实现的血量条显示与血量变化

时间:2021-12-18 13:38:34

相关推荐

【Unity】一个使用Dorween实现的血量条显示与血量变化

学习的时候负责写了关于怪物血量以及其血条显示的脚本,先上代码。

游戏内血量条的制作

1.先展示一下具体是怎么写的

两个Image文件拉成长方形条,并将该组合制作为预制体。

在Source Image中设置一个Squre,然后将Image Type设置为Filled(填充类型),而Fill Amount就可以控制血条的显示了!

使用了Dotween插件,完成了血量延迟减少的一个动画效果

这里是在2秒内,healthSlider.fillAmount的值(当前血量)变成sliderPercent(扣除伤害后的血量)

DOTween.To(() => healthSlider.fillAmount, x => healthSlider.fillAmount = x, sliderPercent, 2);//血量变化

挂载脚本

脚本如下,挂载在怪物游戏对象的身上

using System.Collections;using System.Collections.Generic;using UnityEngine;using UnityEngine.UI;using DG.Tweening;/// <summary>/// 控制怪物血量条的展示和跟随/// </summary>public class Healthbar_UI : MonoBehaviour{public GameObject HealthUIPrefab;//血条的预制体 public GameObject barpoint;//怪物的血条位置Image healthSlider;//血量的滑动条Transform UIbar;//血条位置Transform cam;//摄像机位置public bool alwaysVisible = false;//是否可见public float visibleTime;//可见时长private float TimeLeft;//剩余可见时长private void OnEnable(){cam = Camera.main.transform;//挂载摄像机UIbar = Instantiate(HealthUIPrefab,this.transform, barpoint).transform;healthSlider = UIbar.GetChild(1).GetComponent<Image>();//获取绿条UIbar.gameObject.SetActive(false);//设置是否长久可见healthSlider.fillAmount = 1;//初始血条为满}private void LateUpdate(){//当UI不被销毁的时候,一直朝向摄像机的反方向(即面对摄像机)if (UIbar != null){UIbar.position = barpoint.transform.position;UIbar.forward = -cam.forward;if (TimeLeft <= 0 && !alwaysVisible){UIbar.gameObject.SetActive(false);}else{TimeLeft -= Time.deltaTime;}}}/// <summary>/// 控制血量展示/// </summary>/// <param name="currentHealth">当前的生命值</param>/// <param name="maxHealth">最大血量</param>public void UpdateHralthBar( float currentHealth, float maxHealth){//当血量归0时,摧毁血条if (currentHealth <= 0)Destroy(UIbar.gameObject);TimeLeft = visibleTime;//每次重新攻击,血条显示时间都会重置UIbar.gameObject.SetActive(true); //设置血量时,血条出现float sliderPercent = currentHealth / maxHealth;DOTween.To(() => healthSlider.fillAmount, x => healthSlider.fillAmount = x, sliderPercent, 2);//血量变化}}

怪物对应的血量脚本如下:

using System.Collections;using System.Collections.Generic;using UnityEngine;/// <summary>/// 修改怪物血量的脚本/// </summary>public class MonsterHealth : MonoBehaviour{[Header("怪物生命值")]public float HP;//怪物的生命值private float HP_MAX;//怪物最大生命值private void Start(){HP_MAX = HP;//初始化怪物最大生命值}//对于伤害进行判定public void DamageJudge(string AttackedWeapon){float before = 0;//受到什么样的武器攻击switch (AttackedWeapon) {case "Weapon":AddHP(-3);AttackedWeapon = null;//将碰撞消息设置为空break;case "Bullet":AddHP(-5);AttackedWeapon = null;//将碰撞消息设置为空break;case "Attack3Effect":AddHP(-6);break;}this.GetComponentInChildren<Healthbar_UI>().UpdateHralthBar(HP, HP_MAX);//设置血条详情//设置血条详情if (HP == 0){Destroy(this.gameObject);//销毁自身}}//增减怪物血量public void AddHP(float value){float Before = HP;//返回一个当前血量HP += value;HP = Mathf.Clamp(HP, 0, HP_MAX);//保证血量只会削减到0(而不是负数)}}

PS.关于这里,像接收到碰撞器的消息后,应该从JSON文件中查找该武器,并检索其对应的攻击伤害并计算伤害值,而不是写一个简单的switch语句在这里,但是因为我暂时还没搞懂json表,有待优化。

完成效果

一个边界的判定代码(碰撞体和tag调用)

/// <summary>/// 检测是否掉出游戏边界的类/// </summary>public class GameBoundary: MonoBehaviour{private void OnCollisionEnter(Collision collision){//如果掉落下来的是玩家,就将玩家放回初始化位置if (collision.gameObject.tag == "Player"){collision.gameObject.transform.position = new Vector3(5.7f, 0, 0);}else//销毁掉落到当前位置的其他对象(敌人){Destroy(collision.gameObject);}}}

如果觉得《【Unity】一个使用Dorween实现的血量条显示与血量变化》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。