Unity协程WaitForSeconds在编辑器和WebGL表现不同问题的解决方法参考

最近做的一个效果让下面为了让下面这种图片生成一个翻页效果(使用ShaderGraph中的FlipBook节点),我通过携程来实现连续翻页。

先是定义一个Coroutine coroutine = null;

然后在一定情况下执行coroutine = StartCoroutine(KeepPreview(texSheet));这样这个协程就可以连续执行起来了,达到通过WaitForSeconds来控制翻页进度的目的。

cs 复制代码
	IEnumerator KeepPreview(TexSheet texSheet)
	{
		if (texSheet)
		{
			float frameRate = Mathf.Abs(texSheet.frameRate);
			if (frameRate < 0.01f)
			{
				yield return null;
			}
			else
			{
				float interval = 1 / frameRate;
				yield return new WaitForSeconds(interval);
				texSheet.UpdateSheetIndex();
			}

			coroutine = StartCoroutine(KeepPreview(texSheet));
		}
	}

本来在编辑器里面是比较正常的,但是发布成WebGL之后效果就有问题。在编辑器里面如果增加翻页的速度(就是增加frameRate的值,帧/秒)确实会出现越转越快的效果,从0到几百都是正常的(当然太快了也没什么意义)但是在WebGL中超过翻页60帧/秒左右感觉速度就没有什么变化了。

我想可能的原因是,在编辑器里面使用WaitForSeconds等待某个时间后,应该是马上就执行后面的内容了,这里是texSheet.UpdateSheetIndex()这个方法。但是在发布成WebGL之后,即使等待的时间到了,也要等到本帧结束了才会执行后面的内容,这应该是即使翻页帧率设置很高翻页效果都和60帧/秒差不多得原因,所以在WebGL环境下的处理方式应该变一下,类似下面代码给出的方法,虽然这个并不是很准确的方法,但视觉上应该也看不出来什么问题吧。

cs 复制代码
	IEnumerator KeepPreview(TexSheet texSheet)
	{
		if (texSheet)
		{
			float frameRate = Mathf.Abs(texSheet.frameRate);
			if (frameRate < 0.01f)
			{
				yield return null;
			}
			else
			{
				float interval = 1 / frameRate;
				yield return new WaitForSeconds(interval);
#if UNITY_EDITOR_WIN
				texSheet.UpdateSheetIndex();
#endif
#if UNITY_WEBGL && !UNITY_EDITOR_WIN
				int updateTimes = (int)(Time.deltaTime / interval);
				if(updateTimes <1) { updateTimes = 1; }
				for(int i = 0; i < updateTimes; i++) { texSheet.UpdateSheetIndex(); }
#endif
			}

			coroutine = StartCoroutine(KeepPreview(texSheet));
		}
	}
相关推荐
tealcwu2 天前
【Unity基础】为什么游戏需要物理按键映射?从 Unity Input Manager 到跨引擎输入设计
java·游戏·unity
tealcwu2 天前
【Unity高级】Unity URP:构建同时支持 2D 与 3D 场景的项目完全指南
3d·unity·游戏引擎
淡海水3 天前
10-01-互操作-C#与C++边界的内存管理
unity·c#·游戏引擎·.netcore·gc
小小数媒成员3 天前
UGUI原理(一)
开发语言·游戏·unity·游戏引擎
暴走约伯3 天前
【VFX工具链源码拆解 04】拯救丢失的绑定:Timeline 一键克隆与层级相对路径重映射算法
unity·c#·游戏引擎·硬件工程
小小数媒成员3 天前
Unity UGUI布局组件(LayoutGroup、ContentSizeFitter、LayoutElement)详解
unity·游戏引擎
tealcwu3 天前
【Unity基础】Unity输入与Time.deltaTime的使用原则
unity·游戏引擎
郝学胜-神的一滴4 天前
AI 编程智能体 22:解析器赋能与实战落地全指南
人工智能·程序人生·游戏·unity·游戏引擎
BuHuaX4 天前
Lua 与 ToLua:运行机制及热更新原理
开发语言·unity·junit·c#·lua
总要学点什么5 天前
第92篇:三维特效-圆(逐渐消逝)——从圆心开始,让一个洞把整片光啃到只剩外圈
gis·webgl·cesium·空间分析·1024程序员节