Unity3D實(shí)現(xiàn)待機(jī)狀態(tài)圖片循環(huán)淡入淡出
本文實(shí)例為大家分享了Unity3D實(shí)現(xiàn)圖片循環(huán)淡入淡出的具體代碼,供大家參考,具體內(nèi)容如下
1、說(shuō)明
由于近期項(xiàng)目需求,在網(wǎng)上找了淡入淡出的代碼,但都是兩張圖片淡入淡出結(jié)束后就沒(méi)有了(可能我沒(méi)找到其他好的作品)。所以我做了簡(jiǎn)單的擴(kuò)展
2、簡(jiǎn)單思路
既然待機(jī)狀態(tài)下的圖片淡入淡出切換,所以,首先要判斷何時(shí)為待機(jī)狀態(tài)(即屏幕沒(méi)有任何操作的情況下);其次,圖片靜止一段時(shí)間后,開(kāi)始淡入淡出,第一張圖片淡入,第二張淡出;接著圖片再次靜止一段時(shí)間,然后接著下次的淡入淡出,但因?yàn)槭茄h(huán)淡入淡出,所以要考慮重新加載第一張照片(再下一次淡入淡出要重新加載第二張照片)。還有在淡入淡出的循環(huán)中還要考慮圖片alpha值從1到0然后從0到1的循環(huán)(可以避免閃爍淡入淡出,有種自然的感覺(jué));最后判斷進(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;//無(wú)操作時(shí)間
/*
[HideInInspector]
public bool standby=false;
*/
private bool standby=false;//是否處于待機(jī)狀態(tài)
private float startTime=0;//開(kāi)始待機(jī)時(shí)間
private int imgIndex=2;//圖片索引(圖片名字)
private float remainder=0//下一次待機(jī)開(kāi)始時(shí)間
private bool hasStartNext=false;//是否已經(jīng)加載過(guò)下一張待機(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)上一幀所處的位置
/*變量說(shuō)明
判斷屏幕無(wú)操作(而且鼠標(biāo)的位置要沒(méi)有變化)后就開(kāi)始統(tǒng)計(jì)無(wú)操作的時(shí)間(即startCountTime=true,time++(放在FixedUpdate函數(shù)中),standbyTime++),當(dāng)standbyTime超過(guò)規(guī)定時(shí)間,standby=true;開(kāi)始圖片淡入淡出
*/
/*
程序剛運(yùn)行時(shí),不管有沒(méi)有操作,十秒鐘后開(kāi)始統(tǒng)計(jì)開(kāi)機(jī)時(shí)間
*/
IEnumerator StartPrepareStandby()
{
yield return new WaitForSeconds(runningTime);
startCountTime=true;//開(kāi)始統(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;//開(kāi)始待機(jī)時(shí)間等于程序現(xiàn)在的時(shí)間
remainder=startTime;//記錄淡入淡出開(kāi)始的時(shí)間
//開(kāi)始待機(jī)
standby=true;
}
/*
第一次淡入淡出后開(kāi)始以后的淡入淡出循環(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)用開(kāi)始統(tǒng)計(jì)待機(jī)時(shí)間的協(xié)程
StartCoroutine(StartPrepareStandby());
}
void FixedUpdate()
{
if(startCountTime)
{//無(wú)操作下統(tǒng)計(jì)時(shí)間
if(Input.mousePosition==prevMousePos)
{//判斷鼠標(biāo)是否還在移動(dòng)
time++;
}
else
{//鼠標(biāo)移動(dòng)時(shí),重置待機(jī)時(shí)間
standbyTime=0;
time=0;
}
}
if(time>=50)
{
time=0;
standbyTime++;//待機(jī)秒數(shù)
}
if(standbyTime>StandbyTime)
{//超出規(guī)定的無(wú)操作的時(shí)間即認(rèn)為待機(jī)狀態(tài)
standbyTime--;//開(kāi)始第一次圖片淡入淡出協(xié)程只執(zhí)行一次
startCountTime=false;//停止待機(jī)時(shí)間的統(tǒng)計(jì)
StartCoroutine(StartFirstFade());//開(kāi)始第一圖片淡入淡出
}
}
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來(lái)判斷那一張照片在淡入淡出
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)為是無(wú)操作
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;//已開(kāi)始加載下一張照片
StartCoroutine(StartNextFade());//開(kāi)始下一次淡入淡出協(xié)程
}
}
}
prevMousePos=Input.mousePosition;//記錄每一幀鼠標(biāo)的位置
}
總結(jié)
雖然此次感覺(jué)思路較為清晰但還是花費(fèi)了很長(zhǎng)時(shí)間來(lái)完成這一簡(jiǎn)單的程序;我也深信對(duì)這一簡(jiǎn)單的程序,肯定還有簡(jiǎn)單的做法;自我感覺(jué)自己的程序有點(diǎn)繞且繁瑣(對(duì)程序的擴(kuò)展也可以引用設(shè)計(jì)模式的單例模式或其他模式進(jìn)行再其他腳本處的待機(jī)狀態(tài)判斷)。歡迎各位指點(diǎn)一二!
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
驗(yàn)證碼的三個(gè)常見(jiàn)漏洞和修復(fù)方法
這篇文章主要介紹了驗(yàn)證碼的三個(gè)常見(jiàn)漏洞和修復(fù)方法,本文講解了把驗(yàn)證碼存儲(chǔ)在Cookie中、沒(méi)有進(jìn)行非空判斷、沒(méi)有及時(shí)銷毀驗(yàn)證碼三個(gè)常見(jiàn)問(wèn)題和解決方法,需要的朋友可以參考下2015-03-03
.Net Winform開(kāi)發(fā)筆記(四)透過(guò)現(xiàn)象看本質(zhì)
本文將從Winform應(yīng)用程序中的Program.cs文件的第一行代碼開(kāi)始逐步分析一個(gè)Winform應(yīng)用程序到底是怎樣從出生走向死亡2013-01-01
C#測(cè)量程序運(yùn)行時(shí)間及cpu使用時(shí)間實(shí)例方法
對(duì)一個(gè)服務(wù)器程序想統(tǒng)計(jì)每秒可以處理多少數(shù)據(jù)包,要如何做?答案是用處理數(shù)據(jù)包的總數(shù),除以累記處理數(shù)據(jù)包用的時(shí)間,下面我們看一個(gè)代碼實(shí)例就明白了2013-11-11

