多重血条效果

2024-04-23 00:38
文章标签 效果 多重 血条

本文主要是介绍多重血条效果,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!


描述:

1.当受到伤害较小时,出现“残血”效果

2.当受到伤害较大时,出现“流水”效果

血条由4部分组成

1.剩余学条数

2.当前血条剩余血量image

3.过度血条image

4.下一血条显示颜色 image

注意:这里的血条显示image 需要将Image.Type设置为Filled,fill Method设置为水平,


using UnityEngine;
using System.Collections;
using UnityEngine.UI;//如果只有一条血,那么一条血就是所有的血量
//如果有多条血,那么一条血就设定为一个固定值
public class MultiplyBloodBar : MonoBehaviour
{public Image nowBar;                            //当前血条public Image middleBar;                         //过渡血条public Image nextBar;                           //下一血条public Text countText;                          //剩下的血条数textprivate int count;                              //剩下的血条数(不包括当前血量)private float nowBlood;                         //在一条血中的当前血量,如:100/1000则为100  private float oneBarBlood = 10000f;             //一条血的容量,如:100/1000则为1000     private int colorIndex = 0;public Color[] colors;                          //血条的颜色,注意Alpha值,默认为0private float slowSpeed = 0.1f;                 //受到重伤时( >oneBarBlood)或者处于加血状态,当前血条的流动速度  private float quickSpeed = 1f;                  //受到轻伤时( <oneBarBlood),当前血条的流动速度  private float speed;                            //当前血条采用的速度  private float middleBarSpeed = 0.1f;            //过渡血条的流动速度  private float nowTargetValue;                   //当前血条移动的目标点 private float middleTargetValue;                //过渡血条移动的目标点 private bool isBloodMove = false;               //控制血条的移动  void Update(){MoveNowBar();                               //当前血条的流动 MoveMiddleBar();                            //过渡血条的流动  if (Input.GetMouseButtonDown(0)){ChangeBlood(-3000);}else if (Input.GetMouseButtonDown(1)){ChangeBlood(-15000);}}private void Awake(){}private void Start(){colors = new Color[] { new Color(1, 0, 0, 1), new Color(0, 1, 0, 1), new Color(0,0,1,1) };InitBlood(100000);}/// <summary>  /// 传入总血量,初始化血条  /// </summary>  /// <param name="number"></param>  public void InitBlood(float number){count = (int)(number / oneBarBlood);//剩下的血条数nowBlood = number % oneBarBlood;//最后一条血的当前血量if (nowBlood == 0)  //如果最后一条血的血量刚好充满剩余血条数减一{nowBlood = oneBarBlood;count--;            }colorIndex = count % colors.Length;nowBar.color = colors[colorIndex];nowBar.fillAmount = nowBlood / oneBarBlood;if (count != 0){int nextColorIndex = (colorIndex - 1 + colors.Length) % colors.Length;nextBar.color = colors[nextColorIndex];nextBar.gameObject.SetActive(true);}else{nextBar.gameObject.SetActive(false);}middleBar.gameObject.SetActive(false);countText.text = count + "";}/// <summary>  /// 血量变化,并根据伤害判断是否使用过渡血条  /// </summary>  /// <param name="number"></param>  public void ChangeBlood(float number){nowBlood += number;nowTargetValue = nowBlood / oneBarBlood;isBloodMove = true;if ((number < 0) && (Mathf.Abs(number) <= oneBarBlood))//处于受伤状态并且伤害量较低时  {speed = quickSpeed;middleBar.gameObject.SetActive(true);middleBar.transform.SetSiblingIndex(nextBar.transform.GetSiblingIndex() + 1);middleBar.fillAmount = nowBar.fillAmount;middleTargetValue = nowTargetValue;}else//处于受伤状态并且伤害量较大时,或者处于加血状态  {speed = slowSpeed;middleBar.gameObject.SetActive(false);}}/// <summary>/// 普通血条的流动 /// </summary>void MoveNowBar(){if (!isBloodMove) return;nowBar.fillAmount = Mathf.Lerp(nowBar.fillAmount, nowTargetValue, speed);if (Mathf.Abs(nowBar.fillAmount - nowTargetValue) <= 0.01f)//到达目标点  isBloodMove = false;if (count == 0)nextBar.gameObject.SetActive(false);elsenextBar.gameObject.SetActive(true);if (nowBar.fillAmount >= nowTargetValue)SubBlood();elseAddBlood();}/// <summary>/// 过渡血条的流动  /// </summary>void MoveMiddleBar(){//受到轻伤时( <oneBarBlood),才会出现过渡血条if (speed == quickSpeed){middleBar.fillAmount = Mathf.Lerp(middleBar.fillAmount, middleTargetValue, middleBarSpeed);if (Mathf.Abs(middleBar.fillAmount - 0) < 0.01f){middleBar.transform.SetSiblingIndex(nextBar.transform.GetSiblingIndex() + 1);middleBar.fillAmount = 1;middleTargetValue++;}}}void AddBlood(){float subValue = Mathf.Abs(nowBar.fillAmount - 1);if (subValue <= 0.0f)//到达1  {count++;countText.text = count.ToString();nowBar.fillAmount = 0;nowTargetValue -= 1;nowBlood -= oneBarBlood;nextBar.color = colors[colorIndex];colorIndex++;colorIndex %= colors.Length;nowBar.color = colors[colorIndex];}}void SubBlood(){float subValue = Mathf.Abs(nowBar.fillAmount - 0);if (subValue <= 0.0f)//到达0  {//当前血条已经流动完,将过渡血条放置最前middleBar.transform.SetSiblingIndex(nextBar.transform.GetSiblingIndex() + 2);if (count <= 0){middleBar.gameObject.SetActive(false);Destroy(this);return;};count--;countText.text = count.ToString();nowBar.fillAmount = 1;nowTargetValue += 1;nowBlood += oneBarBlood;colorIndex--;colorIndex += colors.Length;colorIndex %= colors.Length;nowBar.color = colors[colorIndex];int nextColorIndex = colorIndex - 1 + colors.Length;nextColorIndex %= colors.Length;nextBar.color = colors[nextColorIndex];}}}
start中color颜色数组初始化时注意设置颜色的透明组,如果不初始化color数组,颜色值则全部为0,透明度为零。

参考链接 http://blog.csdn.net/lyh916/article/details/47038911

源码工程链接 链接点这里

这篇关于多重血条效果的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/927313

相关文章

hdu1171(母函数或多重背包)

题意:把物品分成两份,使得价值最接近 可以用背包,或者是母函数来解,母函数(1 + x^v+x^2v+.....+x^num*v)(1 + x^v+x^2v+.....+x^num*v)(1 + x^v+x^2v+.....+x^num*v) 其中指数为价值,每一项的数目为(该物品数+1)个 代码如下: #include<iostream>#include<algorithm>

防近视护眼台灯什么牌子好?五款防近视效果好的护眼台灯推荐

在家里,灯具是属于离不开的家具,每个大大小小的地方都需要的照亮,所以一盏好灯是必不可少的,每个发挥着作用。而护眼台灯就起了一个保护眼睛,预防近视的作用。可以保护我们在学习,阅读的时候提供一个合适的光线环境,保护我们的眼睛。防近视护眼台灯什么牌子好?那我们怎么选择一个优秀的护眼台灯也是很重要,才能起到最大的护眼效果。下面五款防近视效果好的护眼台灯推荐: 一:六个推荐防近视效果好的护眼台灯的

多重背包转换成0-1背包

http://acm.hdu.edu.cn/showproblem.php?pid=2191 多重背包特点: 一种物品有C个(既不是固定的1个,也不是无数个) 优化的方法: 运用神奇的二进制,进行物品拆分,转化成01背包 物品拆分,把13个相同的物品分成4组(1,2,4,6) 用这4组可以组成任意一个1~13之间的数! 原理:一个数总可以用2^

【Godot4.3】多边形的斜线填充效果基础实现

概述 图案(Pattern)填充是一个非常常见的效果。其中又以斜线填充最为简单。本篇就探讨在Godot4.3中如何使用Geometry2D和CanvasItem的绘图函数实现斜线填充效果。 基础思路 Geometry2D类提供了多边形和多边形以及多边形与折线的布尔运算。按照自然的思路,多边形的斜线填充应该属于“多边形与折线的布尔运算”范畴。 第一个问题是如何获得斜线,这条斜线应该满足什么样

UniApp实现漂亮的音乐歌词滚动播放效果

在现代的音乐播放应用中,歌词的展示和滚动播放已经成为了一个非常常见的功能。今天,我们将通过UniApp来实现一个漂亮的歌词滚动播放功能。我们将使用UniApp提供的组件和API来完成这个任务。 页面结构 在页面的模板部分,我们需要创建一个音频播放器和歌词展示区域。使用<scroll-view>组件来实现歌词的滚动效果。 <template><view class="audio-co

Nuxt3入门:过渡效果(第5节)

你好同学,我是沐爸,欢迎点赞、收藏、评论和关注。 Nuxt 利用 Vue 的 <Transition> 组件在页面和布局之间应用过渡效果。 一、页面过渡效果 你可以启用页面过渡效果,以便对所有页面应用自动过渡效果。 nuxt.config.js export default defineNuxtConfig({app: {pageTransition: {name: 'fade',mode

Differential Diffusion,赋予每个像素它应有的力量,以及在comfyui中的测试效果

🥽原论文要点 首先是原论文地址:https://differential-diffusion.github.io/paper.pdf 其次是git介绍地址:GitHub - exx8/differential-diffusion 感兴趣的朋友们可以自行阅读。 首先,论文开篇就给了一个例子: 我们的方法根据给定的图片和文本提示,以不同的程度改变图像的不同区域。这种可控性允许我们再现

【Unity小技巧】URP管线遮挡高亮效果

前言 在URP渲染管线环境下实现物体遮挡高亮显示效果,效果如下: Unity URP遮挡高亮 实现步骤 创建层级,为需要显示高亮效果的物体添加层级,比如Player 创建一个材质球,也就是高亮效果显示的材质球找到Universal Renderer Data Assets 4.在Assets上添加两个Render Objects组件 第一个做如下三处设置 指定遮挡层级指

海鲜加工污水处理设备处理效果高

诸城市鑫淼环保小编带大家了解一下海鲜加工污水处理设备处理效果高   海鲜加工污水处理设备通常采用物理、化学和生物处理相结合的方法,对废水中的污染物进行高xiao去除。设备设计紧凑,占地面积小,操作简便,适用于不同规模的海鲜加工厂。   设备特点   高xiao性:采用先进的处理工艺和技术,确保废水处理效果稳定可靠。   占地面积小:设备设计紧凑,占地面积小,适合在有限的空间内安装。