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

侑虎科技 · 2020年06月01日 · 1216 次阅读

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


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问答社区提供了回答


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 数组,不知道有没有相关的解决方案?

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

感谢题主 Wangtao@UWA 问答社区提供了回答


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问答社区提供了回答


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问答社区提供了回答


Unity 版本号获取

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

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

感谢 noah@UWA 问答社区提供了回答


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

暂无回复。
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册