您好,登錄后才能下訂單哦!
這篇文章主要為大家展示了Unity3D如何實(shí)現(xiàn)待機(jī)狀態(tài)圖片循環(huán)淡入淡出,內(nèi)容簡而易懂,希望大家可以學(xué)習(xí)一下,學(xué)習(xí)完之后肯定會有收獲的,下面讓小編帶大家一起來看看吧。
1、說明
由于近期項(xiàng)目需求,在網(wǎng)上找了淡入淡出的代碼,但都是兩張圖片淡入淡出結(jié)束后就沒有了(可能我沒找到其他好的作品)。所以我做了簡單的擴(kuò)展
2、簡單思路
既然待機(jī)狀態(tài)下的圖片淡入淡出切換,所以,首先要判斷何時(shí)為待機(jī)狀態(tài)(即屏幕沒有任何操作的情況下);其次,圖片靜止一段時(shí)間后,開始淡入淡出,第一張圖片淡入,第二張淡出;接著圖片再次靜止一段時(shí)間,然后接著下次的淡入淡出,但因?yàn)槭茄h(huán)淡入淡出,所以要考慮重新加載第一張照片(再下一次淡入淡出要重新加載第二張照片)。還有在淡入淡出的循環(huán)中還要考慮圖片alpha值從1到0然后從0到1的循環(huán)(可以避免閃爍淡入淡出,有種自然的感覺);最后判斷進(jìn)入非待機(jī)狀態(tài),即有操作。
3、代碼實(shí)現(xiàn)及分析
引入U(xiǎn)I命名空間,用UI做淡入淡出效果;
using UnityEngine.UI; public Image nobody_Img1; public Image nobody_Img2;//淡入淡出的兩張圖片 public float fadeTotalTime=5f;//淡入淡出的時(shí)間 public float imageStaticTime=3f;//圖片靜止時(shí)間 public float runningTime=10f;//程序運(yùn)行時(shí)間 public int StandbyTime=5;//無操作時(shí)間 /* [HideInInspector] public bool standby=false; */ private bool standby=false;//是否處于待機(jī)狀態(tài) private float startTime=0;//開始待機(jī)時(shí)間 private int imgIndex=2;//圖片索引(圖片名字) private float remainder=0//下一次待機(jī)開始時(shí)間 private bool hasStartNext=false;//是否已經(jīng)加載過下一張待機(jī)圖片 private bool canLoad=true;//是否可以加載圖片 private bool startCountTime=false;//是否可以統(tǒng)計(jì)待機(jī)時(shí)間 private int standbyTime=0;//待機(jī)時(shí)間 private int time=0;//幀數(shù),用于統(tǒng)計(jì)待機(jī)時(shí)間 private Vector3 prevMousePos=Vector3.zero;//鼠標(biāo)上一幀所處的位置 /*變量說明 判斷屏幕無操作(而且鼠標(biāo)的位置要沒有變化)后就開始統(tǒng)計(jì)無操作的時(shí)間(即startCountTime=true,time++(放在FixedUpdate函數(shù)中),standbyTime++),當(dāng)standbyTime超過規(guī)定時(shí)間,standby=true;開始圖片淡入淡出 */ /* 程序剛運(yùn)行時(shí),不管有沒有操作,十秒鐘后開始統(tǒng)計(jì)開機(jī)時(shí)間 */ IEnumerator StartPrepareStandby() { yield return new WaitForSeconds(runningTime); startCountTime=true;//開始統(tǒng)計(jì)待機(jī)時(shí)間 } /* 進(jìn)入待機(jī)后,顯示兩張圖片,并靜止一段時(shí)間后在循環(huán)淡入淡出 */ IEnumerator StartFirstFade() { //現(xiàn)實(shí)兩張圖片 nobody_Img1.enabled=true; nobody_Img2.enabled=true; yield return new WaitForSeconds(imageStaticTime); //重置時(shí)間 startTime=Time.time;//開始待機(jī)時(shí)間等于程序現(xiàn)在的時(shí)間 remainder=startTime;//記錄淡入淡出開始的時(shí)間 //開始待機(jī) standby=true; } /* 第一次淡入淡出后開始以后的淡入淡出循環(huán) */ IEnumerator StartNextFade() { if(imgIndex>=4)//判斷圖片索引是否越界(圖片索引也是圖片名) imgIindex=0; //canLoad在這用于判斷加載哪一張圖片 if(canLoad) { nobody_Img1.sprite=Resources.Load(imgIndex.ToString(),typeof(Sprite)) as Sprite; } else { nobody_Img2.sprite=Resources.Load(imgIndex.ToString(),typeof(Sprite)) as Sprite; } canLoad = !canLoad;//取反,用于區(qū)分圖片的加載 imgIndex++;//圖片索引累加,下次加載下一張圖片 yield return new WaitForSeconds(imageStaticTime); //重置淡入淡出時(shí)間 startTime=Time.time; remainder=startTime; //圖片已加載,等待下次的加載 hasStartNext=false; } void Start() { //調(diào)用開始統(tǒng)計(jì)待機(jī)時(shí)間的協(xié)程 StartCoroutine(StartPrepareStandby()); } void FixedUpdate() { if(startCountTime) {//無操作下統(tǒng)計(jì)時(shí)間 if(Input.mousePosition==prevMousePos) {//判斷鼠標(biāo)是否還在移動 time++; } else {//鼠標(biāo)移動時(shí),重置待機(jī)時(shí)間 standbyTime=0; time=0; } } if(time>=50) { time=0; standbyTime++;//待機(jī)秒數(shù) } if(standbyTime>StandbyTime) {//超出規(guī)定的無操作的時(shí)間即認(rèn)為待機(jī)狀態(tài) standbyTime--;//開始第一次圖片淡入淡出協(xié)程只執(zhí)行一次 startCountTime=false;//停止待機(jī)時(shí)間的統(tǒng)計(jì) StartCoroutine(StartFirstFade());//開始第一圖片淡入淡出 } } void Update() { if(Input.GetMouseButtonDown(0)) {//每次鼠標(biāo)按下都停止待機(jī)及相關(guān)的判斷 StopCoroutine(StartNextFade());//停止淡入淡出 standby=false;//退出待機(jī)狀態(tài) //保留當(dāng)前圖片的alpha值 if(canLoad) {//根據(jù)當(dāng)前canLoad來判斷那一張照片在淡入淡出 nobody_Img1.color=new Color(1,1,1,1); nobody_Img2.color=new Color(1,1,1,0); } else { nobody_Img1.color=new Color(1,1,1,0); nobody_Img2.color=new Color(1,1,1,1); } //隱藏待機(jī)圖片 nobody_Img1.enabled=false; nobody_Img2.enabled=false; //重置待機(jī)時(shí)間 standbyTime=0; time=0; } else if(Input.GetMouseButtonUp(0)) {//鼠標(biāo)每次抬起都認(rèn)為是無操作 startCountTime=true; prevMousePos=Input.mousePosition; } if(standby) { if(Time.time<startTime+fadeTotalTime) { float alphaValue=(Time.time-remainder)/fadeTotalTime; if(canLoad) { nobody_Img1.color=new Color(1,1,1,1-alphaValue); nobody_Img2.color=new Color(1,1,1,alphaValue); } else { nobody_Img1.color=new Color(1,1,1,alphaValue); nobody_Img2.color=new Color(1,1,1,1-alphaValue); } } else { if(!hasStartNext) { hasStartNext=true;//已開始加載下一張照片 StartCoroutine(StartNextFade());//開始下一次淡入淡出協(xié)程 } } } prevMousePos=Input.mousePosition;//記錄每一幀鼠標(biāo)的位置 }
以上就是關(guān)于Unity3D如何實(shí)現(xiàn)待機(jī)狀態(tài)圖片循環(huán)淡入淡出的內(nèi)容,如果你們有學(xué)習(xí)到知識或者技能,可以把它分享出去讓更多的人看到。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。