今天看了段DNF視頻,有發現到血條變化效果是這樣的: 這裡為了突出Boss受到的傷害之大,也就是玩家的傷害之高,以至於Boss的血條變化會出現殘影效果。 那麼,就簡單使用協程來實現了一下這種效果: 實現思路也蠻簡單的:就是在Canvas下創建兩個Slider,分別是Slider和Slider01,先 ...
今天看了段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 }【敬畏能量 敬畏自然】