Unity3D实现待机状态图片循环淡入淡出

 更新时间:2020年6月25日 10:34  点击:2303

本文实例为大家分享了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,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);
  }
  //隐藏待机图片
   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,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());//开始下一次淡入淡出协程
   }
  }
 }
 prevMousePos=Input.mousePosition;//记录每一帧鼠标的位置
}

总结

虽然此次感觉思路较为清晰但还是花费了很长时间来完成这一简单的程序;我也深信对这一简单的程序,肯定还有简单的做法;自我感觉自己的程序有点绕且繁琐(对程序的扩展也可以引用设计模式的单例模式或其他模式进行再其他脚本处的待机状态判断)。欢迎各位指点一二!

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持猪先飞。

[!--infotagslink--]

相关文章

  • 原生js实现fadein 和 fadeout淡入淡出效果

    js里面设置DOM节点透明度的函数属性:filter= "alpha(opacity=" + value+ ")"(兼容ie)和opacity=value/100(兼容FF和GG)。 先来看看设置透明度的兼容性代码: 复制代码 代码如下: function setOpacity(ele, opacity) { if (...2014-06-07
  • Unity3D UGUI实现翻书特效

    这篇文章主要为大家详细介绍了Unity3D UGUI实现翻书特效,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-06-25
  • jQuery实现图片文字淡入淡出效果

    这篇文章主要介绍了jQuery实现图片文字淡入淡出效果,需要的朋友可以参考下...2015-12-24
  • Unity3D使用GL实现图案解锁功能

    这篇文章主要为大家详细介绍了Unity3D使用GL实现图案解锁功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-06-25
  • Unity3D实现飞机大战游戏(1)

    这篇文章主要为大家详细介绍了Unity3D实现飞机大战游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-11-03
  • C#实现窗体淡入淡出效果的方法总结

    C#实现窗体淡入淡出效果的方法总结,需要的朋友可以参考一下...2020-06-25
  • Unity3D基于OnGUI实时显示FPS

    这篇文章主要介绍了Unity3D基于OnGUI实时显示FPS,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-06-25
  • Unity3D仿写Button面板事件绑定功能

    这篇文章主要为大家详细介绍了Unity3D仿写Button面板事件绑定功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-06-25
  • unity3D实现三维物体跟随鼠标

    这篇文章主要为大家详细介绍了unity3D实现三维物体跟随鼠标,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-06-25
  • Unity3D游戏开发数据持久化PlayerPrefs的用法详解

    在本篇文章里小编给大家整理了关于Unity3D游戏开发之数据持久化PlayerPrefs的使用的相关知识点内容,需要的朋友们参考下。...2020-06-25
  • unity3d调用手机或电脑摄像头

    这个是在网上看到的,经测试可以在电脑上运行,确实调用了本地摄像头。有需要的小伙伴可以参考下。...2020-06-25
  • Unity3D Shader实现镜子效果

    这篇文章主要为大家详细介绍了Unity3D Shader实现镜子效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-06-25
  • Unity3D实现待机状态图片循环淡入淡出

    这篇文章主要为大家详细介绍了Unity3D实现待机状态图片循环淡入淡出,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-06-25
  • Unity3D Shader实现动态屏幕遮罩

    这篇文章主要为大家详细介绍了Unity3D Shader实现动态屏幕遮罩效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-06-25
  • Unity3D使用UGUI开发原生虚拟摇杆

    这篇文章主要为大家详细介绍了Unity3D使用UGUI开发原生虚拟摇杆,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-06-25
  • Unity3D UGUI特效之Image高斯模糊效果

    这篇文章主要为大家详细介绍了Unity3D UGUI特效之Image高斯模糊效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-06-25
  • Unity3D实现物体闪烁效果

    这篇文章主要为大家详细介绍了Unity3D实现物体闪烁效果,类似霓虹灯、跑马灯、LED灯效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-06-25
  • Delphi实现窗口文字淡入淡出渐变效果的方法

    这篇文章主要介绍了Delphi实现窗口文字淡入淡出渐变效果,需要的朋友可以参考下...2020-06-30
  • Unity3D利用DoTween实现卡牌翻转效果

    这篇文章主要为大家详细介绍了Unity3D利用DoTween实现卡牌翻转效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-06-25
  • Unity3D实现分页系统

    这篇文章主要为大家详细介绍了Unity3D实现分页系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-06-25