Timeline中粒子系统受FixedTime影响问题

1)Timeline中粒子系统受FixedTime影响问题
2)函数体内局部变量在GC的时候无法释放
3)Mac版本升级至10.15后,Unity导入新的MP3文件卡住或者闪退
4)升级到MacOS Catalina后Unity出现空白错误
5)如何获取已打包好的APP的Unity开发版本号


这是第182篇UWA技术知识分享的推送。今天我们继续为大家精选了若干和开发、优化相关的问题,建议阅读时间10分钟,认真读完必有收获。

UWA 问答社区:answer.uwa4d.com
UWA QQ群2:793972859(原群已满员)


Timeline

Q:新建工程后,新创建一个Timeline和ParticleSystem,将ParticleSystem放入Timeline中,调大系统的FixedTime,在Editor运行状态下会明显发现粒子系统播放时出现卡顿(如果只是在Timeline预览是正常的)。看API和相关接口均未发现有相关的说明。请问这个是正常状态吗?如果希望粒子系统不受物理时间影响应该如何操作呢?Unity版本2018.4.0与2019.2.9均发现该问题。

A:解决方案:
1、不勾选Control Particle Systems选项,这样Timeline只负责粒子系统的生命周期管理,不会驱动粒子系统播放,相应的坏处就是在不运行游戏时不能预览粒子的效果了。


2、修改官方代码,重写一个播放粒子的轨道。

 

原因查找:
使用dnSpy打开UnityEngine.Timeline.dll,查看ControlPlayableAsset的代码。可以看到当updateParticels为true时,会把ParticleSystem收集起来,传入SearchHiearchyAndConnectParticleSystem方法中。

然后在上述方法中,会为每个粒子系统创建一个ParticleControlPlayable,在之后的逻辑会把这些Playable连接到这个Timeline系统的output上。

在ParticleControlPlayable类中,可以看到在PrepareFrame方法中,会调用粒子系统的Simulate方法。


Timeline就是在这里驱动粒子系统播放的。

 

这里调用的ParticleSystem.Simulate方法的原型如下图:


发现最后一个fixedTimeStep参数默认为true。

 

所以在这里更新粒子系统默认就使用了FixedTimestep。把反编译的代码拷贝出来,修改一下类名,自己重写一个播放粒子的轨道和片断,测试即可。

 

感谢张首峰@UWA问答社区提供了回答,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/5dc3757c14ec712eefaf0150


GC

Q:当前我们有一个模块使用协程调用,UnityWebRequest以及FileStream来实现安卓上从StreamingAsset 拷贝文件到 PersistentDataPath中,代码如下:

 public static IEnumerator CopyStreamingToPersistentPathByUnityWebRequestItor(string str)
    {
        string des = Application.persistentDataPath + "/data.cache";

        using (UnityWebRequest www = UnityWebRequest.Get(str))
        {
            yield return www.SendWebRequest();

            if (!string.IsNullOrEmpty(www.error))
            {
                Debug.LogError("WWW Error : " + str);
            }
            else
            {
                Debug.Log("WWW Successful");
                byte[] bytes = www.downloadHandler.data;
                FileStream fileStream = new FileStream(des, FileMode.Create);
                if (fileStream != null && fileStream.CanWrite)
                {
                    fileStream.Write(bytes, 0, bytes.Length);
                    fileStream.Flush();
                    fileStream.Close();
                    fileStream.Dispose();
                    Debug.Log("Copy to " + des);
                }
                else
                {
                    fileStream.Close();
                    fileStream.Dispose();
                    Debug.LogError("Copy Faild");
                }
            }
        }
    }

然后使用UWA GOT检测发现这块byte[]始终驻留在内存中,即使在执行完协程后调用GC.Collect也无法回收该byte数组,不知道有没有相关的解决方案?

 

A1:重写DownloadHandlerScript,使用流的方式直接写入目标地址就可以了。对于UnityWebRequest的DownloadHandler,小文件没问题,大文件就要出事。如果加载一个20MB的文件,那么不仅Mono堆分配20MB,Native Heap也分配同样大小的byte数组,而且Native 中会不断刷新数组大小直到满足。采用Stream方式缓存,Mono堆大小就只取决于缓存池的大小,Native heap也不会撑大,可以大幅度降低PSS。

感谢题主Wangtao@UWA问答社区提供了回答,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/5db11167e84db43d6efbdb46


Crash

Q:Mac版本:10.15 ;Unity版本:2018.2.11f1
详细描述:未升级Mac版本前,新MP3文件正常导入,可以正常识别文件。升级后,如果在Unity开着的情况下拖入文件,Unity会直接闪退(如图1),重新打开显示资源未识别(如图2)。如果Unity在关着的状态下,放入MP3文件,打开项目一直显示正在导入且不会完成,删除MP3文件后才能正常打开项目。怀疑升级Mac后Unity还是使用了Mac旧的API,但是项目又暂时不能升级Unity版本,问下这种情况有什么好的解决方案吗?大家有碰过这种情况吗?

 

图1

 

图2

 

A:这个官方论坛上有相关的问题:
https://forum.unity.com/threads/installing-unity-on-macos-catalina.689089/
升级Unity版本即可。

感谢阎杨将@UWA问答社区提供了回答,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/5db83d2a9fabd93d420713ac


Editor

Q:我们最近升级了Mac系统到最新的Catalina,然后打开自己的工程以后一直有一个空白的错误,清不掉也点不开,Unity的版本是2017.4.10,跟Unity论坛上这个人的错误是一样的。
https://forum.unity.com/threads/macos-catalina-blank-error-appears-with-no-info.761903/

我看ISSUE TRACKER上有这样一个问题:
https://issuetracker.unity3d.com/issues/macos-empty-error-appears-in-the-console-window-when-certain-files-are-present-in-the-project-with-macos-catalina?_ga=2.1691889.1595892744.1571291033-1700034320.1508724105

是说2017不会修复吗?求助有人遇到相同的问题吗?

(PS:.net版本从3.5调到4.6就没了,不过感觉不是解决办法。)

A:发现T4M里面有个js脚本,工程里面不能有js脚本,删除了就好了。

感谢题主关@UWA问答社区提供了回答,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/5da80270e84db43d6efbda1a


Unity版本号获取

Q:有什么办法可以获取已打包好的APP的Unity开发版本号吗?比如通过Assembly-CSharp.dll可否读出Unity版本号?

A:如果AssetBundle没加密混淆,可以用AssetStudio打开AssetBundle、AssetStudio的标题栏,会显示该AssetBundle的版本号。换言之,AssetBundle里应该存有相应的Unity版本号。

感谢noah@UWA问答社区提供了回答,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/5daf11da9fabd93d420712a7

封面图来源:A Terrible Kingdom
以创造性的方式编写游戏Timeline。


今天的分享就到这里。当然,生有涯而知无涯。在漫漫的开发周期中,您看到的这些问题也许都只是冰山一角,我们早已在UWA问答网站上准备了更多的技术话题等你一起来探索和分享。欢迎热爱进步的你加入,也许你的方法恰能解别人的燃眉之急;而他山之“石”,也能攻你之“玉”。

官网:www.uwa4d.com
官方技术博客:blog.uwa4d.com
官方问答社区:answer.uwa4d.com
UWA学堂:edu.uwa4d.com
官方技术QQ群:793972859(原群已满员)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值