看了一篇使用UGUI实现多层血条效果的文章后,想来试着做一下多层血条。

自己实现的思路类似于上面链接中作者的思路。

首先,整理一下我们需要用到的一些属性:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class HPUIManager : MonoBehaviour {[Header("当前血量显示名称")]public Text _CurretHpNumName;[Header("当前血量层名称")]public Text _CurretHpLayerName;[Header("输入当前血量显示名称")]public string _CurretHpNumNameString;[Header("输入当前血量层名称")]public string _CurretHpLayerNameString;[Header("当前血量显示值")]public Text _CurretHpNum;[Header("当前血量层值")]public Text _CurretHpLayer;[Header("当前血量图片")]public Image _CurretHpImage;[Header("空血底图")]public Image _LateHpImage;[Header("最大血量值")]public float _ResultHpNum;[Header("伤害值")]public float _HurtNum;[Header("失血速度")][Range(0,1)]public float _LoseHpSpeed = 0.1f;[Header("空血底色颜色")]public Color _NullHpColor;[Header("血条数量颜色")]public List<Color> _UIHpList;//剩余血量数private float _CurretHpNumString;//剩余血量条private float _CurretHpLayerString;//血量条数private int _UIHpListCount;//伤害血条比例private float _HurtHpNum;//当前受到伤害后血条比例private float _CurretHpHurt = 1;//临时存储最大生命值float _TempResultHpNum;//临时存储最大生命值float _ResultHpNumSum;//临时存储当前长度(第一行血)int _CurrteCount;//临时存储BG长度(第二行血)int _LateCount;public float CurretHpNumString{get{return _CurretHpNumString;}set{_CurretHpNumString = value;}}public float CurretHpLayerString{get{return _CurretHpLayerString;}set{_CurretHpLayerString = value;}}public int UIHpListCount{get{ return _UIHpListCount;}set{_UIHpListCount = value;}}public float HurtHpNum{get{return _HurtHpNum;}set{_HurtHpNum = value;}}public float CurretHpHurt{get{return _CurretHpHurt;}set{_CurretHpHurt = value;}}// Use this for initializationvoid Start (){}// Update is called once per framevoid Update (){}
}

如下图所示:

下面上逻辑部分:

 void Start (){//显示文本文框的字(显示名称)_CurretHpNumName.text = _CurretHpNumNameString;//显示文本文框的字(显示名称)_CurretHpLayerName.text = _CurretHpLayerNameString;//记录血条数UIHpListCount = _UIHpList.Count;//开始存储最大值_TempResultHpNum = _ResultHpNum;//开始存储最大值_ResultHpNumSum = _ResultHpNum;}
void Update (){//当前血量层数显示值_CurretHpLayer.text = _UIHpList.Count.ToString();//当前血量显示值_CurretHpNum.text = (_ResultHpNum = _TempResultHpNum).ToString();//计算出每条血量扣血比例 = 伤害值/(总血量/记录的血条数量);HurtHpNum = _HurtNum /(_ResultHpNumSum / UIHpListCount);//如果满足第一行血条比例长度大于受到伤害后血条比例 && 第一个子物体的名字不是当前血条名字(第一行血) &&当前颜色不是空血颜色 进行血条减少动画。if (_CurretHpImage.fillAmount > CurretHpHurt && _CurretHpImage.transform.parent.GetChild(0).name != _CurretHpImage.name && _CurretHpImage.color != _NullHpColor){_CurretHpImage.fillAmount -= _LoseHpSpeed * Time.deltaTime;}//如果满足第二行血条比例长度大于受到伤害后血条比例 && 第一个子物体的名字不是当前血条名字(第二行血) &&当前颜色不是空血颜色 进行血条减少动画。else if (_LateHpImage.fillAmount > CurretHpHurt && _LateHpImage.transform.parent.GetChild(0).name != _LateHpImage.name && _LateHpImage.color != _NullHpColor){_LateHpImage.fillAmount -= _LoseHpSpeed * Time.deltaTime;}//(记录最大血条层数 - 当前血条层数)的余数为0(此数为偶数)if ((UIHpListCount - _UIHpList.Count)%2 == 0 ){//当前血条层数不为0,修改二行血条的先后赋值集合的颜色索引if (_UIHpList.Count != 0){_CurrteCount = 1;_LateCount = 2;}}//(此数为奇数)else{//当前血条层数不为0,修改二行血条的先后赋值集合的颜色索引if (_UIHpList.Count !=0){_CurrteCount = 2;_LateCount = 1;}}//长度为0(结束血条的意思)if (_UIHpList.Count == 0){//底色血条为空血条色(第二行)_LateHpImage.color = _NullHpColor;//隐藏(第一行)_CurretHpImage.gameObject.SetActive(false);}//判断(记录最大血条层数-当前血条层数)是否小于最大减1(防止索引溢出)if (UIHpListCount - _UIHpList.Count < UIHpListCount - 1){//修改二行血条的颜色_CurretHpImage.color = _UIHpList[_UIHpList.Count - _CurrteCount];_LateHpImage.color = _UIHpList[_UIHpList.Count - _LateCount];}else{//防止索引溢出if (_UIHpList.Count !=0){//判断(当前)颜色是否为0的索引颜色(第一行)if (_CurretHpImage.color == _UIHpList[0]){//第二行为空血色_LateHpImage.color = _NullHpColor;}//判断(稍后)颜色是否为0的索引颜色(第二行)else if (_LateHpImage.color == _UIHpList[0]){//第一行为空血色_CurretHpImage.color = _NullHpColor;}}}//满足第一行血条比例长度<=0 && 第一行颜色不是空血色if (_CurretHpImage.fillAmount <= 0 && _CurretHpImage.color != _NullHpColor){//交换渲染位置_CurretHpImage.transform.SetSiblingIndex(0);//减少血条数索引_UIHpList.RemoveAt(_UIHpList.Count - 1);//重置血条比例长度_CurretHpImage.fillAmount = 1;//重置受伤血条比例长度CurretHpHurt = 1;}//满足第二行血条比例长度<=0 && 第二行颜色不是空血色else if (_LateHpImage.fillAmount <= 0 && _LateHpImage.color != _NullHpColor){//交换渲染位置_LateHpImage.transform.SetSiblingIndex(0);//减少血条数索引_UIHpList.RemoveAt(_UIHpList.Count - 1);//重置血条比例长度_LateHpImage.fillAmount = 1;//重置受伤血条比例长度CurretHpHurt = 1;}}
 /// <summary>/// 点击失血判断事件/// </summary>public void OnClickHurtHP(){//限制点击判断防止血条减少BUG, 如果满足血条长度小于并且等于受到伤害后血条比例 && 防止索引溢出if (_CurretHpImage.fillAmount <= CurretHpHurt && _UIHpList.Count != 0){//计算当前受到伤害后血条比例。CurretHpHurt = _CurretHpImage.fillAmount - HurtHpNum;//计算显示的血量_TempResultHpNum -= _HurtNum;}//限制点击判断防止血条减少BUG, 如果满足血条长度小于并且等于受到伤害后血条比例 && 防止索引溢出else if (_LateHpImage.fillAmount <= CurretHpHurt && _UIHpList.Count != 0){//计算当前受到伤害后血条比例。CurretHpHurt = _LateHpImage.fillAmount - HurtHpNum;//计算显示的血量_TempResultHpNum -= _HurtNum;}}
   /// <summary>/// 四舍五入/// </summary>/// <param name="Num"></param>/// <returns></returns>int RoundingNum(float Num){if (Num % 1 >= 0.5f){Num += 1;}return (int)Num;}

本篇文章最后,放上插件地址,如果有研究需要,可以下载参考:

自制实现DNF多行血条小插件包

(一)关于UGUI怪物多行血条实现————DNF怪物血条相关推荐

  1. unity制作类似DNF动态血条(仅一层血条)

    unity制作类似DNF动态血条(仅一层血条) 这是某个游戏公司的招聘题目,我的思路给大家参考一下 上图为效果图 如下代码: using System.Collections; using Syste ...

  2. UGUI学习笔记(十二)自制血条控件

    一.效果展示 二.实现过程 2.1 准备工作 首先在场景中使用「Image」创建如下结构并命名为「LifeBar」.需要注意的是内部的「Image」都需要将锚点设置到最左侧,高度设置为自适应.在父元素 ...

  3. 制作血条_unity-UGUI如何制作血条

    UI的制作在游戏当中是必不可少的,因为显示游戏信息非常的重要.那么在UI中血条就非常的重要了.而且它出现的也是非常频繁的.所以我们应该要学会血条的制作.其实这个也是非常简单的.那么做血条UI我们可以用 ...

  4. 关闭血条上显示的服务器名字,魔兽世界怀旧服远处看不到血条怎么办 姓名板血条显示距离修改宏分享...

    魔兽世界怀旧服中,大家会发现很多时候无论是在打怪还是在副本中经常的看不到距离远一点的血条,也就是姓名板,那么怎么解决这个问题呢?下面就来为大家分享一下怀旧服姓名板血条显示距离的宏. 姓名板血条显示距离 ...

  5. java怎么写boss血条_Laya:多元血条(BOSS的多管血)

    必备资源: 必备资源.png 调用步骤: 1.定义类 private var _mutipleBossHpBar:BattlerMultipleHpBar = new BattlerMultipleH ...

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

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

  7. 一个进度条,类似DNF的血条

    最近要写下个血瓶效果,于是用PS做了两张图,用DIV做出了这样的效果: 这个底色可以用CSS随便改,但这个粉红背景就得改图片了. 代码也很简单,就是JS,CSS了,代码如下: <%@ page ...

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

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

  9. Unity 2D血条制作方式

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

最新文章

  1. java xpath 命名空间_【转】玩转 XPath 和缺省命名空间(Default Namespaces)
  2. java学习笔记2022.1.12
  3. 十分钟让你明白Objective-C的语法(和Java、C++的对比)
  4. Visual Studio 2008 SP1 和 net framework 3.5 新特性
  5. Python入门级2
  6. C语言经典递归算法之和式分解
  7. Python+Opencv图像处理新手入门教程(一):介绍,安装与起步
  8. GBDT、随机森林、xgboost算法原理解析视频公开
  9. PHP数组常用方法(优化版)
  10. 微信小程序上传照片到服务器
  11. java gui 做闹钟,用JAVA怎样编写一个可以在eclipse中运行的闹钟程序?
  12. 良田高拍仪 网页版 二次开发_档案产品库良田书籍高拍仪BS3000P
  13. Day25 - Event Capture, Propagation, Bubbling and Once
  14. HTML5期末大作业:仿唯品会购物网站设计——仿唯品会购物商城(5页) HTML+CSS+JavaScript 学生DW网页设计作业成品 商城网站设计
  15. 电脑打字习惯让人提笔忘字
  16. java修饰符的解析
  17. INSEC WORLD丨【漏洞攻防与安全研究论坛】演讲实录精选
  18. 10进制,8进制,16进制转换
  19. 我国农村宅基地有偿退出机制构建研究
  20. 【Python】30行代码实现一个万年历

热门文章

  1. 友盟小米收不到推送消息_一个轻量级、可插拔的Android消息推送框架。一键集成推送(极光推送、友盟推送、华为、小米推送等)...
  2. 平板如何下载鸿蒙系统,安装了鸿蒙系统的平板,很丝滑很流畅
  3. 寻雷-----更新且不完整版
  4. VC++程序设计与应用--开发环境
  5. MySQL生成测试用垃圾数据
  6. 一个将Android手机屏幕投影到电脑屏幕上的软件
  7. react-native 热更新expo-update使用心得
  8. CDR 2017选择适合自己的工作区
  9. This is why you never end up hiring good developers 这就是为什么你永远招不到优秀的开发人员
  10. 微信企业付款接口API