1. 程式人生 > 程式設計 >Unity3D實現待機狀態圖片迴圈淡入淡出

Unity3D實現待機狀態圖片迴圈淡入淡出

本文例項為大家分享了Unity3D實現圖片迴圈淡入淡出的具體程式碼,供大家參考,具體內容如下

1、說明

由於近期專案需求,在網上找了淡入淡出的程式碼,但都是兩張圖片淡入淡出結束後就沒有了(可能我沒找到其他好的作品)。所以我做了簡單的擴充套件

2、簡單思路

既然待機狀態下的圖片淡入淡出切換,所以,首先要判斷何時為待機狀態(即螢幕沒有任何操作的情況下);其次,圖片靜止一段時間後,開始淡入淡出,第一張圖片淡入,第二張淡出;接著圖片再次靜止一段時間,然後接著下次的淡入淡出,但因為是迴圈淡入淡出,所以要考慮重新載入第一張照片(再下一次淡入淡出要重新載入第二張照片)。還有在淡入淡出的迴圈中還要考慮圖片alpha值從1到0然後從0到1的迴圈(可以避免閃爍淡入淡出,有種自然的感覺);最後判斷進入非待機狀態,即有操作。

3、程式碼實現及分析

引入UI名稱空間,用UI做淡入淡出效果;

using UnityEngine.UI;

public Image nobody_Img1;
public Image nobody_Img2;//淡入淡出的兩張圖片
public float fadeTotalTime=5f;//淡入淡出的時間
public float imageStaticTime=3f;//圖片靜止時間
public float runningTime=10f;//程式執行時間
public int StandbyTime=5;//無操作時間
/*
[HideInInspector]
public bool standby=false;
*/

private bool standby=false;//是否處於待機狀態
private float startTime=0;//開始待機時間
private int imgIndex=2;//圖片索引(圖片名字)
private float remainder=0//下一次待機開始時間
private bool hasStartNext=false;//是否已經載入過下一張待機圖片
private bool canLoad=true;//是否可以載入圖片
private bool startCountTime=false;//是否可以統計待機時間
private int standbyTime=0;//待機時間
private int time=0;//幀數,用於統計待機時間
private Vector3 prevMousePos=Vector3.zero;//滑鼠上一幀所處的位置

/*變數說明
判斷螢幕無操作(而且滑鼠的位置要沒有變化)後就開始統計無操作的時間(即startCountTime=true,time++(放在FixedUpdate函式中),standbyTime++),當standbyTime超過規定時間,standby=true;開始圖片淡入淡出
*/

/*
程式剛執行時,不管有沒有操作,十秒鐘後開始統計開機時間
*/
IEnumerator StartPrepareStandby()
{
 yield return new WaitForSeconds(runningTime);
 startCountTime=true;//開始統計待機時間
}

/*
進入待機後,顯示兩張圖片,並靜止一段時間後在迴圈淡入淡出
*/
IEnumerator StartFirstFade()
{
 //現實兩張圖片
 nobody_Img1.enabled=true;
 nobody_Img2.enabled=true;
 yield return new WaitForSeconds(imageStaticTime);
 //重置時間
 startTime=Time.time;//開始待機時間等於程式現在的時間
 remainder=startTime;//記錄淡入淡出開始的時間
 //開始待機
 standby=true;
}

/*
第一次淡入淡出後開始以後的淡入淡出迴圈
*/
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;//取反,用於區分圖片的載入
 imgIndex++;//圖片索引累加,下次載入下一張圖片
 yield return new WaitForSeconds(imageStaticTime);
 //重置淡入淡出時間
 startTime=Time.time;
 remainder=startTime;
 //圖片已載入,等待下次的載入
 hasStartNext=false;
}

void Start()
{
 //呼叫開始統計待機時間的協程
 StartCoroutine(StartPrepareStandby());
}

void FixedUpdate()
{
 if(startCountTime)
 {//無操作下統計時間
  if(Input.mousePosition==prevMousePos)
  {//判斷滑鼠是否還在移動
   time++;
  }
  else
  {//滑鼠移動時,重置待機時間
   standbyTime=0;
   time=0;
  }
 }
 if(time>=50)
 {
  time=0;
  standbyTime++;//待機秒數
 }
 if(standbyTime>StandbyTime)
 {//超出規定的無操作的時間即認為待機狀態
  standbyTime--;//開始第一次圖片淡入淡出協程只執行一次
  startCountTime=false;//停止待機時間的統計
  StartCoroutine(StartFirstFade());//開始第一圖片淡入淡出
 }
}

void Update()
{
 if(Input.GetMouseButtonDown(0))
 {//每次滑鼠按下都停止待機及相關的判斷
  StopCoroutine(StartNextFade());//停止淡入淡出
  standby=false;//退出待機狀態
  //保留當前圖片的alpha值
  if(canLoad)
  {//根據當前canLoad來判斷那一張照片在淡入淡出
   nobody_Img1.color=new Color(1,1,1);
   nobody_Img2.color=new Color(1,0);
  }
  else
  {
   nobody_Img1.color=new Color(1,0);
   nobody_Img2.color=new Color(1,1);
  }
  //隱藏待機圖片
   nobody_Img1.enabled=false;
   nobody_Img2.enabled=false;
   //重置待機時間
   standbyTime=0;
   time=0;
 }
 else if(Input.GetMouseButtonUp(0))
 {//滑鼠每次抬起都認為是無操作
  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-alphaValue);
    nobody_Img2.color=new Color(1,alphaValue);
   }
   else
   {
    nobody_Img1.color=new Color(1,alphaValue);
    nobody_Img2.color=new Color(1,1-alphaValue);
   }
  }
  else
  {
   if(!hasStartNext)
   {
    hasStartNext=true;//已開始載入下一張照片
    StartCoroutine(StartNextFade());//開始下一次淡入淡出協程
   }
  }
 }
 prevMousePos=Input.mousePosition;//記錄每一幀滑鼠的位置
}

總結

雖然此次感覺思路較為清晰但還是花費了很長時間來完成這一簡單的程式;我也深信對這一簡單的程式,肯定還有簡單的做法;自我感覺自己的程式有點繞且繁瑣(對程式的擴充套件也可以引用設計模式的單例模式或其他模式進行再其他指令碼處的待機狀態判斷)。歡迎各位指點一二!

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。