简易血槽残影设计方案(使用协程)

  • 简易血槽残影设计方案(使用协程)已关闭评论
  • 159 次浏览
  • A+
所属分类:.NET技术
摘要

  今天看了段DNF视频,有发现到血条变化效果是这样的:     这里为了突出Boss受到的伤害之大,也就是玩家的伤害之高,以至于Boss的血条变化会出现残影效果。

  今天看了段DNF视频,有发现到血条变化效果是这样的:

 简易血槽残影设计方案(使用协程)

 

  这里为了突出Boss受到的伤害之大,也就是玩家的伤害之高,以至于Boss的血条变化会出现残影效果。

  那么,就简单使用协程来实现了一下这种效果:

  简易血槽残影设计方案(使用协程)

 

  实现思路也蛮简单的:就是在Canvas下创建两个Slider,分别是Slider和Slider01,先将每个Slider中的Fill Area下的Fill拖到其父项下,然后除了Background、Fill,其余子项全部删除,再将Slider01放入Slider中。

  这里,就把Slider01作为Slider的残影。

  因为想最快写出效果,所以就直接用了协程来实现的,当然,如果在实际项目中有很多需要优化的地方。

  把脚本绑定到最外边的Slider组件下。

  [锤子猫原创代码,转载请标注来源]

  测试代码如下:

 1 using System.Collections;  2 using System.Collections.Generic;  3 using UnityEngine;  4 using UnityEngine.UI;  5   6 public class HealControl : MonoBehaviour  7 {  8     public float curHeal; //当前血量  9  10     public float allHeal; //总血量 11  12     public float reHeal; //增量 13  14     public float reTime = 0.01f; //递减时间 15  16     public float[] tempData; //临时数据组 17  18     public Slider fatherSlider, sonSlider; //父子血条 19  20     // Start is called before the first frame update 21     void Start() 22     { 23         tempData = new float[2] { 0f, 0f }; //初始化 0:旧父血条值  1:子血条值 24  25         fatherSlider = this.GetComponent<Slider>(); //获取父血条组件 26         sonSlider = this.GetComponent<Slider>().transform.GetChild(1).GetComponent<Slider>(); //获取子血条组件 27  28         tempData[0] = curHeal; //给旧父血条值赋初值 29         tempData[1] = tempData[0]; //给子血条值赋初值 30  31         fatherSlider.value = curHeal / allHeal; //计算血量值后赋给血条 32         sonSlider.value = tempData[0] / allHeal; //计算子血量值后赋给血条 33     } 34  35     // Update is called once per frame 36     void Update() 37     { 38         Blood0peration(); 39     } 40  41     public void Blood0peration() //血量值换算成血条值 42     { 43         if (curHeal < tempData[0] && Mathf.Abs(curHeal - tempData[0]) > 0.1f) //判断父血量发生变化 44         { 45             StartCoroutine(TimerForFBloodReduce()); 46         } 47         else if (curHeal > tempData[0] && Mathf.Abs(curHeal - tempData[0]) > 0.1f) 48         { 49             StartCoroutine(TimerForFBloodAdd()); 50         } 51         else 52         { 53             StopCoroutine(TimerForFBloodReduce()); 54             StopCoroutine(TimerForFBloodAdd()); 55             tempData[0] = curHeal; 56         } 57  58         if (curHeal < tempData[1] && Mathf.Abs(curHeal - tempData[1]) > 0.1f) //判断子血量发生变化 59         { 60             StartCoroutine(TimerForSBloodReduce()); 61         } 62         else 63         { 64             StopCoroutine(TimerForSBloodReduce()); 65             tempData[1] = curHeal; 66         } 67     } 68  69     private IEnumerator TimerForFBloodReduce() 70     { 71         while (Mathf.Abs(curHeal - tempData[0]) > 0.1f) 72         { 73             tempData[0] -= reHeal; 74             fatherSlider.value = tempData[0] / allHeal; 75             yield return new WaitForSeconds(reTime); 76         } 77     } //父血条计算定时器-增 78  79     private IEnumerator TimerForFBloodAdd() 80     { 81         while (Mathf.Abs(curHeal - tempData[0]) > 0.1f) 82         { 83             tempData[0] += reHeal; 84             fatherSlider.value = tempData[0] / allHeal; 85             yield return new WaitForSeconds(reTime); 86         } 87     } //父血条计算定时器-减 88  89     private IEnumerator TimerForSBloodReduce() 90     { 91         while (Mathf.Abs(curHeal - tempData[1]) > 0.1f) 92         { 93             tempData[1] -= reHeal; 94             sonSlider.value = tempData[1] / allHeal; 95             yield return new WaitForSeconds(reTime + 0.02f); 96         } 97     } //子血条计算定时器-减 98 }