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

ops/2024/10/24 9:28:23/

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

        先是定义一个Coroutine coroutine = null;

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

	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环境下的处理方式应该变一下,类似下面代码给出的方法,虽然这个并不是很准确的方法,但视觉上应该也看不出来什么问题吧。

	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_WINtexSheet.UpdateSheetIndex();
#endif
#if UNITY_WEBGL && !UNITY_EDITOR_WINint updateTimes = (int)(Time.deltaTime / interval);if(updateTimes <1) { updateTimes = 1; }for(int i = 0; i < updateTimes; i++) { texSheet.UpdateSheetIndex(); }
#endif}coroutine = StartCoroutine(KeepPreview(texSheet));}}


http://www.ppmy.cn/ops/95329.html

相关文章

【Datawhale AI夏令营第四期】 魔搭-大模型应用开发方向笔记 Task02 精读BaseLine代码

【Datawhale AI夏令营第四期】 魔搭-大模型应用开发方向笔记 Task02 学习BaseLine代码 Task02学习链接&#xff1a; https://linklearner.com/activity/14/11/30 学习期间听了开营仪式&#xff0c;在老师的介绍下才发现跑完BaseLine以后学习手册还有后半部分的知识&#xff0c…

AI赋能软件测试:从自动化到智能化,让测试工作事半功倍

引言 在当今这个日新月异的数字时代&#xff0c;人工智能&#xff08;AI&#xff09;正以不可阻挡之势渗透并重塑着各行各业&#xff0c;其中&#xff0c;软件开发与测试领域更是迎来了前所未有的变革。随着软件系统的复杂性日益增加&#xff0c;用户对软件质量、性能及安全性的…

C语言传递指针给函数

C 语言允许您传递指针给函数&#xff0c;只需要简单地声明函数参数为指针类型即可。 下面的实例中&#xff0c;我们传递一个无符号的 long 型指针给函数&#xff0c;并在函数内改变这个值 实例1&#xff1a;获取系统的时间值 能接受指针作为参数的函数&#xff0c;也能接受数…

MES系统从哪几方面提升企业制造水平?

在当今这个快速变化的制造环境中&#xff0c;企业对于提升制造水平的追求从未停止。制造执行系统&#xff08;MES&#xff09;作为连接企业战略规划与车间实际操作的核心工具&#xff0c;其重要性日益凸显。盘古信息MES系统&#xff0c;凭借其独特的功能模块和创新的设计理念&a…

力扣 58. 最后一个单词的长度

题目描述 思路 下意识想到先以空格作为分割符对字符串进行分割得到若干个子字符串&#xff0c;然后用字符串长度计算函数计算最后一个子字符串的长度。 该思路代码如下&#xff1a; class Solution:def lengthOfLastWord(self, s: str) -> int:s_array s.split()last_le…

外卖系统小程序安卓app如何开发运营?

外卖系统的有效开发是一个复杂而系统的过程&#xff0c;需要综合考虑需求分析、系统设计、技术选型、开发实施、测试上线以及后期维护等多个方面。以下是一个详细的开发流程建议&#xff1a; 一、需求分析 用户调研&#xff1a;深入了解目标用户群体&#xff08;包括消费者、…

汽车IVI中控OS Linux driver开发实操(二十三):驱动的设备probe及匹配

第一个函数:probe linux驱动模型是分成三个部分的,设备(结构体device),驱动(结构体device_driver),总线(结构体bus_type)。在Linux内核中,设备驱动通常会实现一个probe函数,它是