一:效果演示


二:使用

——面板参数设置

HpSlider:Slider组件
TopBar:顶部血条
DownBar:底部血条
LastBarColor:最后一条血条的颜色
T:血量改变时缓动的插值(如果不需要缓动效果则设置为1即可)

——常规使用
创建Slider组件,添加HpBar脚本

using System.Collections.Generic;
using UnityEngine;public class Test : MonoBehaviour
{public HpBar hpBar;private void Awake(){List<Color> colorList = new List<Color>() { Color.blue, Color.cyan, Color.green, Color.red };hpBar.SetHpBar(100, colorList);}private void Update(){if (Input.GetKeyDown(KeyCode.A)){hpBar.ChangeValue(6);}if (Input.GetKeyDown(KeyCode.D)){hpBar.ChangeValue(-8);}}
}

——其他使用
CurIndex:当前第几管血
CurHp:当前血量
OnValueChanged:每次血量改变时的回调
OnIndexChanged:每次血条下标改变时的回调


三:代码实现

using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using System;/// <summary>
/// 血条
/// </summary>
public class HpBar : MonoBehaviour
{//血条slider组件public Slider hpSlider;//顶部血条public Image topBar;//底部血条public Image downBar;//最后一个血条颜色public Color lastBarColor;//缓动差值public float t = 0.1f;//血条数值变化后public Action<int, long> OnValueChanged;//血条下标变化后public Action<int, long> OnIndexChanged;//当前下标(第几管血,降序)int m_CurIndex;public int CurIndex{get{return m_CurIndex;}}//当前血量long m_CurHp;public long CurHp{get{return m_CurHp;}}//总血量long m_TotalHp;//每一管血条的血量float m_PerValue;//血条颜色列表List<Color> m_ColorList = new List<Color>();//目标值float m_TargetValue;//目标下标int m_TargetIndex;/// <summary>/// 设置血条/// </summary>public void SetHpBar(long totalHp, List<Color> colorList, long curHp = -1){m_ColorList.Clear();m_TotalHp = totalHp;m_ColorList = colorList;m_CurHp = curHp == -1? m_TotalHp: curHp;InitHpBar();}/// <summary>/// 设置血条/// </summary>public void SetHpBar(long totalHp, List<string> colorList, long curHp = -1){m_ColorList.Clear();m_TotalHp = totalHp;foreach (var colorHtml in colorList){Color color;ColorUtility.TryParseHtmlString(colorHtml, out color);m_ColorList.Add(color);}m_CurHp = curHp == -1? m_TotalHp: curHp;InitHpBar();}/// <summary>/// 初始化血条/// </summary>void InitHpBar(){m_PerValue = m_TotalHp * 1f / m_ColorList.Count;hpSlider.minValue = 0;hpSlider.maxValue = m_PerValue;UpdateIndexAndValue();UpdateHpBar(true);UpdateColor();}/// <summary>/// 更新血条颜色/// </summary>void UpdateColor(){topBar.color = m_ColorList[m_CurIndex - 1];downBar.color = m_CurIndex - 1 <= 0? lastBarColor: m_ColorList[m_CurIndex - 2];}/// <summary>/// 更新目标下标和目标值/// </summary>void UpdateIndexAndValue(){//更新下标int targetIndex = 1;int indexOffset = m_CurHp % m_PerValue <= 0.01f? Mathf.FloorToInt(m_CurHp / m_PerValue) - 1: Mathf.FloorToInt(m_CurHp / m_PerValue);targetIndex = Mathf.Clamp(targetIndex + indexOffset, 1, m_ColorList.Count);m_TargetIndex = targetIndex;//更新值float targetValue = 0;if (m_CurHp % m_PerValue <= 0.01f){if (m_TargetIndex == 1&& m_CurHp != m_PerValue){targetValue = 0;}else{targetValue = m_PerValue;}}else{targetValue = m_CurHp % m_PerValue;}m_TargetValue = targetValue;OnValueChanged?.Invoke(m_CurIndex, m_CurHp);}/// <summary>/// 更新血条/// </summary>void UpdateHpBar(bool isForce){if (isForce){m_CurIndex = m_TargetIndex;hpSlider.value = m_TargetValue;OnValueChanged?.Invoke(m_CurIndex, m_CurHp);}else{if (m_CurIndex == m_TargetIndex){hpSlider.value = Mathf.Lerp(hpSlider.value, m_TargetValue, t);if (Mathf.Abs(hpSlider.value - m_TargetValue) <= 0.01f){hpSlider.value = m_TargetValue;}}else{if (m_CurIndex < m_TargetIndex){hpSlider.value = Mathf.Lerp(hpSlider.value, m_PerValue, t * 2);if (Mathf.Abs(hpSlider.value - m_PerValue) <= 0.01f){m_CurIndex++;hpSlider.value = 0;OnIndexUpdate();}}else if (m_CurIndex > m_TargetIndex){hpSlider.value = Mathf.Lerp(hpSlider.value, 0, t * 2);if (Mathf.Abs(hpSlider.value - 0) <= 0.01f){m_CurIndex--;hpSlider.value = m_PerValue;OnIndexUpdate();}}}}}/// <summary>/// 改变血条数值/// </summary>public void ChangeValue(int value){m_CurHp = (long)Mathf.Clamp(m_CurHp + value, 0, m_TotalHp);UpdateIndexAndValue();}private void Update(){UpdateHpBar(false);}/// <summary>/// 血条下标变化后/// </summary>void OnIndexUpdate(){UpdateColor();OnIndexChanged?.Invoke(m_CurIndex, m_CurHp);}
}

Unity中实现多层血条相关推荐

  1. unity中简单的血条自作

    unity中制作血条有很多方法,多数用NGUI:这里我就说说一个简单的血条制作方法吧: 这个血条制作不像NGUI一样,它是靠一段代码就可以实现的,但看起来比较效果比较差,还是看代码吧: public ...

  2. 关于DNF多层血条的实现

    本篇博客主要简述类似于DNF的多层血条的实现方法, 图一是伤害过高,造成的流血效果. 图二是伤害比较低,造成的掉血效果. 之前自己写了一种通过三个Slider的多层血条,实现方式就是控制血条的背景和前 ...

  3. (Unity)人物的血条,能量条UI设置,受伤扣血变化等

    前言 在各种游戏制作中,我们都经常要接触到敌人,此时血条和能量成了我们的必要属性.也是一个游戏的玩法核心. 1.对需求进行初步分析,了解 人物的血条是一个具象化的物体,在收到伤害或恢复指令后,可以进行 ...

  4. unity3d做会减少的血条_Unity3d中NGUI加强版血条(Healthbar)的制作

    这阵子项目中需要用到一种特殊样式的血条.描述如下: 1. 正常颜色为红色.受到伤害后,即将扣除的血量变暗(暗红色),并有下降动画效果: 2. 加护盾效果后,增加一部分血量值,该额外部分为白色,护盾效果 ...

  5. 解决SolidWorks模型导入Unity中出现多层父物体的问题

    经验来源于博主 HDarker. 一.问题描述 在将SolidWorks等软件绘制的模型导入Unity中时,会出现多层父物体的问题,如下图所示. 下面介绍一种解决办法. 使用的软件是SolidWork ...

  6. Unity插件NGUI制作血条--HUD的基本使用

    一.利用NGUI制作 血条. 1.在2d场景中 先拖一个BG进去.然后创建一个 sprite.修改名字为LifeBar. 在inspector面板中 uisprite属性值.如下: 2.在lifeba ...

  7. [Unity]角色头顶血条的实现的几种方法以及优化拓展

    1.UGUI 的 Image 1.1biliboard广告板中使用update函数 1.1.1在角色头顶的血条 参考资料2,biliboard广告板中使用update函数.如果场景中含有update函 ...

  8. Unity UGUI实现王者荣耀版多格血条

    上篇讲述了Boss多层血条的实现方法,这篇就主要讲述一下类似于王者荣耀,LoL的分段式血条, 这样的血条在游戏的视觉层会带给玩家非常好的体验.就好比玩家买了一个狂徒铠甲.如过你用 的是分段血条的话,就 ...

  9. Unity 2D血条制作方式

    博主在前两篇博客中写了关于分段式血条和多层血条的实现方式,但是基于一下初学者的考虑,还是决定把2D的血条制作方式也是贴出来,方便大家进行学习和使用. 第一步:我们创建一个Slider,把图片和背景修改 ...

最新文章

  1. lua sleep函数实现
  2. Ubuntu中清理Network下Connect to Server的入口
  3. java1002java,疯狂java学习笔记1002---抽象类及接口
  4. MVC学习笔记1 MVC概述
  5. Git 存储过程探究_无赖皮肤-ChinaUnix博客
  6. 【zipkin】链路追踪
  7. huffman算法c语言程序,哈夫曼算法构造代码
  8. Linux线程ID是32位的,对于linux中线程id的讨论
  9. 哲理短文一则:揭示最好的成功法则
  10. oracle如何删除物理表空间,oracle 如何删除被误删物理文件的表空间
  11. EntityTransaction
  12. opencv 修改图片尺寸
  13. 福师电子计算机主要以,福师《计算机应用基础》在线作业(6) 参考资料
  14. DSP降噪拾音器 语音增强 噪声抑制器 反馈抑制器
  15. python3自动抢淘宝单
  16. Android:根据阳历日期获取农历日期
  17. Java游戏---俄罗斯方块
  18. apicloud 获取手机虚拟键盘高度
  19. SIRIUS更新日志|SIRIUS人脸识别更新日志|天狼星人脸识别更新日志
  20. PS怎样把成图变成素描或者速写稿

热门文章

  1. 【已解决】win10系统使用耳机时左右音量不同
  2. C++混合中文英文字符串匹配查找改进
  3. MYSQL死掉后自动重启脚本
  4. 2021年中国高校大数据挑战赛A题完整版
  5. RuoYi Vue - 若依框架的 Vue 版本,免费开源、生态强大、专业的 admin 后台管理系统,基于 Vue + Element
  6. internet 连接共享已经被网络管理员禁用
  7. neo4j数据备份和恢复
  8. C++ 中的 string::npos 示例
  9. ChatGPT+Newbing制作PPT
  10. LIO_SAM程序实现原理学习笔记(二)