服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C# - Unity3D实现待机状态图片循环淡入淡出

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

2022-09-01 11:30柒月丶枫 C#

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

本文实例为大家分享了Unity3D实现图片循环淡入淡出的具体代码,供大家参考,具体内容如下

1、说明

由于近期项目需求,在网上找了淡入淡出的代码,但都是两张图片淡入淡出结束后就没有了(可能我没找到其他好的作品)。所以我做了简单的扩展

2、简单思路

既然待机状态下的图片淡入淡出切换,所以,首先要判断何时为待机状态(即屏幕没有任何操作的情况下);其次,图片静止一段时间后,开始淡入淡出,第一张图片淡入,第二张淡出;接着图片再次静止一段时间,然后接着下次的淡入淡出,但因为是循环淡入淡出,所以要考虑重新加载第一张照片(再下一次淡入淡出要重新加载第二张照片)。还有在淡入淡出的循环中还要考虑图片alpha值从1到0然后从0到1的循环(可以避免闪烁淡入淡出,有种自然的感觉);最后判断进入非待机状态,即有操作。

3、代码实现及分析

引入UI命名空间,用UI做淡入淡出效果;

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
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;//记录每一帧鼠标的位置
}

总结

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

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

原文链接:https://blog.csdn.net/puraples/article/details/50900880

延伸 · 阅读

精彩推荐
  • C#Unity实现卡牌翻动效果

    Unity实现卡牌翻动效果

    这篇文章主要为大家详细介绍了Unity实现卡牌翻动效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    杨亚东8422022-03-11
  • C#C# 删除数组内的某个值、一组值方法详解

    C# 删除数组内的某个值、一组值方法详解

    在本篇文章里小编给大家整理的是关于C# 如何删除数组内的某个值、一组值的相关知识点,需要的朋友们学习下。...

    粽先生8492022-08-28
  • C#C#操作注册表的方法详解

    C#操作注册表的方法详解

    这篇文章主要介绍了C#操作注册表的方法,结合实例形式较为详细的分析了C#针对注册表的创建、打开、读取、写入、修改、删除等技巧,需要的朋友可以参考...

    方倍8712021-11-05
  • C#UGUI实现图片拖拽功能

    UGUI实现图片拖拽功能

    这篇文章主要为大家详细介绍了UGUI实现图片拖拽功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    u01423092310402022-03-11
  • C#C#实现创建桌面快捷方式与添加网页到收藏夹的示例

    C#实现创建桌面快捷方式与添加网页到收藏夹的示例

    本文是介绍了c#通过纯代码创建快捷方式与添加网页到收藏夹,非常具有实用价值,有需要的朋友可以来了解一下。...

    wd3302604023942021-12-08
  • C#Unity通过UGUI的Slider调整物体颜色

    Unity通过UGUI的Slider调整物体颜色

    这篇文章主要为大家详细介绍了Unity通过UGUI的Slider调整物体颜色,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    这个世界会好吗6092022-03-11
  • C#浅谈C#中的Async和Await的用法详解

    浅谈C#中的Async和Await的用法详解

    这篇文章主要介绍了浅谈C#中的Async和Await的用法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们...

    依乐祝11122022-07-13
  • C#C#合并多种格式文件为PDF的方法

    C#合并多种格式文件为PDF的方法

    这篇文章主要为大家详细介绍了C#合并多种格式文件为PDF的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    E-iceblue9852022-02-19