Unity中遇到的那些坑

C#

浏览数:51

2019-10-11

本文主要记录在使用Unity做项目时候遇到一些莫名其妙的坑###

以及适当的解决方案或是避开的方案####

———————不定期更新———————####

1、OnTriggerEnter函数,在同一个点摆两个相同的Collider。用同一个脚本接受消息后,使用协程实例化GameObject时可能会有一个接收不到。(版本:4.6)

2、不要在Awake函数中做函数操作,在引用时可能会有莫名其妙的问题。最好是Awake函数里做对象的实例化,Start函数里开始做第一次的函数调用。具体可以参考博客:Unity中自带函数的执行顺序.(版本:4.6)

3、Material深拷贝的问题,Material a = b会深拷贝,注意释放的问题,如果只是修改material属性,应该使用shareMaterial。(版本:4.6)

4、粒子系统:Mesh类渲染Bug;如果粒子系统是Mesh类型,在发射点处于镜头之外时,整个粒子都会不渲染;解决方法是增大粒子的Scale,Scale不会影响粒子的渲染效果,但是会增加渲染范围。(版本:4.6)

5、粒子系统:粒子系统Mesh类型在摄像机范围之外时会停止播放并且不消失,当镜头转过来时还会发现粒子仍然保持之前离开镜头时的姿势停在原地;解决方法,增加一个可见性判断的脚本,如果不可见则进行一般处理。(版本:4.6)

6、不能用中文。

7、WWW在iOS上加载http的时候必须用yield等待;WWW里的URL在PC上可以用While(r.isDone)等待http连接,但是在iOS平台上会陷入死循环,需要创建协程去等。

8、Prefab实例化;Prefab上如果有Unity的NavMeshAgent组件需要被实例化在一个NavMesh上的合理的点,否在会报错。

9、Prefab实例化;Prefab上有飘带组件,在首次出生的时候不能瞬间切换坐标,否则飘带会消失。

10、IL2PP:SocketErrorCode平台差异;SocketException在Windows平台是10035,但是在iOS上报10036;解决方案是把这两个都设为Connecting。(版本:4.6.3f1)

11、UGUI的Mask在iPad2,iPad mini上失效,在iPad air2上没事;解决方案,需要在导出选项上选择Use 24-bit Depth Buffer。

12、Animator.Rebind()。会重建骨骼信息,会使Root节点出现旋转和位置的偏移;解决方案Animator.play(name,layer,ttime)。ttime设为0;

13、Destroy操作很保守。例如,销毁mesh时,并不会销毁material、texture,更不会清理脚本资源。解决方案,合理做法是依赖很卡的UnloadUnusedAssets、LoadScene清理无引用资源(另注意前者是异步的),或者Bundle.Unload(true),这些方案各有限制。

14、int a = 10;int b = 8; float c = a/b; c的结果会一直显示为0,因为int类型无法自己强制转化为float类型。

15、项目中模型和动画是分开的,后面美术同学把部分动画重新调整,重新导入的时候会发现部分动画动不了了,后来经查是美术在动画调整的过程中把骨骼的名字改了,导致和之前模型对应不上。解决方式,让美术把命名统一一下,重新导入。 版本:4.6.9

作者:Unity云中客