首页 > 其他分享 >简易血槽残影设计方案(使用协程)

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

时间:2022-11-16 02:44:06浏览次数:51  
标签:协程 tempData curHeal allHeal Slider 残影 Abs public 血槽

  今天看了段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 }

标签:协程,tempData,curHeal,allHeal,Slider,残影,Abs,public,血槽
From: https://www.cnblogs.com/moegarn/p/16894602.html

相关文章

  • python 多进程 多线程 协程
    多进程-进程池1fromconcurrent.futuresimportProcessPoolExecutor23withProcessPoolExecutor(max_workers=10)asexecutor:4results=executor.map......
  • Python用yield form 实现异步协程爬虫
    很古老的用法了,现在大多用的aiohttp库实现,这篇记录仅仅用做个人的协程底层实现的学习。争取用看得懂的字来描述问题。1.什么是yield如果还没有怎么用过的话,直接把yield......
  • Python3-异步协程
     importasyncioimporttimeasyncdefget_request(url):print('正在请求的url:',url)awaitasyncio.sleep(2)#支持异步模块代码print('请求结束:'......
  • 线程、 进程、 协程
    1.多线程(单线程、多线程)#线程、进程#线程是执行单位进程->公司线程->员工#进程是资源单位(每一个进程里面至少有一个线程)#单线程deffunc():for......
  • Unity之"诡异"的协程
    为什么说是诡异的协程呢?首先从一个案例说起吧,示例如下:游戏目标:让小车进入到对应颜色屋子里,即可获得一分。(转弯的道路可控) 为了让小车能够平滑转弯,小车的前进方向需要......
  • 协程
    概念提示 协程不是进程也不是线程,而是一个特殊的函数。这个函数可以在某个地方被“挂起”,并且可以重新在挂起处外继续运行。所以说,协程与进程、线程相比并不是一个维度......
  • 【Go】协程
    今天主要学习了一下go语言的多线程,也写了一些例子,最开始还是很困惑。比如下面这个例子:packagemainimport"fmt"funcloop(){fori:=0;i<10;i++{fmt.Printf("......
  • 协程 + epoll 的两个小例子
    getcontext/setupcontext/swapcontext/setcontext 方式的协程实现#include<stdio.h>#include<stdlib.h>#include<string.h>#include<poll.h>#include<errno.h>......
  • lua协程
    localcoroutine=coroutinelocaltable=tablelocalcoroutine_create=coroutine.createlocalcoroutine_resume=coroutine.resumelocalcoroutine_yield=co......
  • 协程
    阅读目录一引子二协程介绍三Greenlet模块四Gevent模块引子之前我们学习了线程、进程的概念,了解了在操作系统中进程是资源分配的最小单位,线程是CPU调度的最小单位。......