unity血条

8 篇文章 0 订阅

项目需求,做了一个通用的血条,在这里记录一下

using UnityEngine;
using UnityEngine.UI;
namespace GCD.Ui
{
    //加减血有缓动效果血条。
    //如果没有加uiHpEff,就是普通血条
    [AddComponentMenu("UI/XBlood")]
    public class UiCommonBloodPanel : MonoBehaviour
    {
        [Space(10),Header("普通血条")]
        public Image uiHpBar = null;

        [SerializeField, Header("血条加血image")]
        private Image  uiAddImage = null;
        [SerializeField, Header("血条减血image")]
        private Image  uiCutImage = null;

        [SerializeField, Header("血条缓动效果")]
        private Image uiHpEff = null;

        [SerializeField, Header("血条缓动速度")]
        private float Speed = 0.3f;

        private float _tValue = 0; //当前血条值
        private float _lastValue = 0; //上次血条值

        private bool _isAddHp; 
        private bool _isCutHp;

        /// <summary>
        /// 血条初始化
        /// </summary>
        /// <param 当前血量="curhp"></param>
        /// <param 最大血量="maxhp"></param>
        public void Init(float curhp, float maxhp) 
        {
            if (uiHpBar != null && maxhp > 0)
            {
                _tValue = curhp / maxhp;
                uiHpBar.fillAmount = _tValue;
            }
            if (uiHpEff != null)
            {
                uiHpEff.fillAmount = _tValue;              
            }
            if (uiAddImage != null && uiCutImage != null )
            {
                CTools.SetActive(uiAddImage, false);
                CTools.SetActive(uiCutImage, false);

            }
            _isAddHp = false;
            _isCutHp = false;
        }

        /// <summary>
        /// 血条更新
        /// </summary>
        /// <param 当前血量="curhp"></param>
        /// <param 最大血量="maxhp"></param>
        public void OnSelfHpChange(float curhp, float maxhp)
        {
            _tValue = curhp / maxhp;
            if (uiHpEff == null && uiHpBar!= null) 
            {
                uiHpBar.fillAmount = _tValue;  //如果没有挂缓动效果,直接加血
                return;
            }

            if (uiCutImage == null || uiCutImage == null || uiHpEff == null) return;


            if (_tValue > uiHpEff.fillAmount) //加血
            {
                _lastValue = uiHpEff.fillAmount;
                _isAddHp = true; _isCutHp = false;
                uiHpEff.sprite = uiAddImage.sprite;
                uiHpEff.fillAmount = _tValue;
                uiHpBar.fillAmount = _lastValue;
            }

            if (_tValue < uiHpBar.fillAmount)//减血
            {
                _lastValue = uiHpBar.fillAmount;
                _isCutHp = true; _isAddHp = false;
                uiHpEff.sprite = uiCutImage.sprite;
                uiHpBar.fillAmount = _tValue;
                uiHpEff.fillAmount = _lastValue;
            }
        }
        void Update()
        {
            if (uiHpEff != null && uiHpBar != null && uiHpBar.fillAmount != uiHpEff.fillAmount )
            {
                if (uiHpBar.fillAmount < uiHpEff.fillAmount && _isAddHp)
                {
                    uiHpBar.fillAmount += Speed * Time.deltaTime;
                    if (uiHpBar.fillAmount >= uiHpEff.fillAmount)
                    {
                        _isAddHp = false;
                        uiHpBar.fillAmount = uiHpEff.fillAmount;
                    }
                }

                if (uiHpBar.fillAmount < uiHpEff.fillAmount & _isCutHp)
                {
                    uiHpEff.fillAmount -= Speed * Time.deltaTime;
                    if (uiHpEff.fillAmount <= uiHpBar.fillAmount)
                    {
                        _isCutHp = false;
                        uiHpEff.fillAmount = uiHpBar.fillAmount;
                    }
                }
            }

            uiHpBar.color = Color.Lerp(Color.red, Color.green, uiHpBar.fillAmount);
        }

        public void Release() 
        {
            _tValue = 0;
            _isAddHp = false ;
            _isCutHp = false ;
            Speed = 0;
            _lastValue = 0;
        }




    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 要实现Unity血条的跟随,可以按照以下步骤进行: 1. 创建一个UI血条的Canvas,并在其中添加一个Image组件作为血条的背景。 2. 在Canvas中再添加一个Image组件作为血条的填充,可以设置其初始宽度为0。 3. 编写脚本,使用RectTransform组件获取到血条的位置,并根据目标物体的位置动态调整血条的位置。 4. 在每一帧更新血条的填充,根据目标物体当前的生命值和最大生命值计算出血条的宽度,并设置给血条的填充Image组件。 下面是一个简单的示例代码: ``` using UnityEngine; using UnityEngine.UI; public class HealthBar : MonoBehaviour { public Transform target; // 目标物体的Transform组件 public float offset = 1f; // 血条距离目标物体的偏移量 private Image fillImage; // 血条的填充Image组件 private RectTransform rectTransform; // 血条的RectTransform组件 void Start() { fillImage = transform.Find("Fill").GetComponent<Image>(); rectTransform = GetComponent<RectTransform>(); } void Update() { // 根据目标物体的位置,动态调整血条的位置 Vector3 targetPos = target.position + Vector3.up * offset; Vector3 screenPos = Camera.main.WorldToScreenPoint(targetPos); rectTransform.position = screenPos; // 计算血条的宽度,并设置给填充Image组件 float healthPercent = target.GetComponent<Health>().currentHealth / target.GetComponent<Health>().maxHealth; fillImage.fillAmount = healthPercent; } } ``` 在这个脚本中,我们使用了目标物体的Transform组件来获取其位置,并根据偏移量计算出血条的位置。然后,我们计算出目标物体的当前生命值占最大生命值的百分比,并设置给血条的填充Image组件。在Update()函数中,我们每一帧更新血条的位置和宽度。 ### 回答2: 在Unity中,实现血条跟随的方法有很多。我将介绍其中一种常用的实现方式。 首先,我们需要在场景中创建一个血条的UI元素,可以使用UI Canvas来实现。然后,我们可以通过创建一个UI Slider来表示血条。 接下来,我们需要编写一个脚本来实现血条的跟随效果。首先,我们需要获取需要跟随的对象的位置信息,比如玩家角色或敌人角色。 然后,在Update函数中,我们可以使用Transform组件的position属性来获取当前对象的位置,并将其赋值给血条的UI元素的transform.position属性,以使血条与对象保持同样的位置。 此外,还可以通过使用RectTransform组件的anchoredPosition属性来进行微调,以确保血条与对象的位置关系更准确。 如果需要血条能够面向摄像机,可以使用Quaternion.LookRotation函数来设置血条的旋转方向。 最后,为了确保血条始终显示在对象的前方,我们可以使用Canvas组件的Sorting Order属性来调整血条的显示顺序。 总结起来,我们需要创建一个UI Slider来表示血条,并编写一个脚本来实现血条的跟随效果。这样,血条将始终保持在需要跟随的对象的位置,并面向摄像机。 ### 回答3: Unity中,实现血条跟随角色的方法如下: 首先,创建一个血条的UI对象,在Unity编辑器中拖拽图片或者通过代码创建,在角色的位置上方显示。可以使用Unity的UGUI系统来创建血条,例如使用Slider组件来表示血条的进度。 接下来,在角色的脚本中,需要通过代码获取血条的引用。可以使用FindGameObjectWithTag或者Find方法,通过血条的Tag或者名称来获取。 接着,通过设置血条对象的position属性,将血条设置到角色的头顶。可以通过添加一个偏移量来更好地调整血条与角色头部的位置关系。 然后,将血条的父节点设置为角色的Transform对象,这样血条就能够跟随角色的移动。 在每一帧更新中,通过修改血条的位置和朝向,使血条一直保持在角色的头顶。可以使用Unity的LateUpdate()方法或者Update()方法来实现。 最后,根据角色当前的生命值,动态地修改血条的显示进度。可以通过修改Slider组件的value属性,来控制血条的进度。 综上所述,以上是一种在Unity中实现血条跟随角色的基本方法,通过设置位置、设置父节点以及动态修改进度,可以使血条始终跟随角色并显示正确的生命值。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值