Unity Day4
1.Unity 中的 Destroy 和 Destroylmmediate 的区别是什么?
答案:
- Destroy 方法 可以指定删除的延迟时问,如果第二个参数不坑写,最快也会在下一帧前完成 删除。也就是如果 Destroy 对象后马上判空,该对象不会为空。实际的对象销毁操作始终延迟到当前更新循环结束,但始终在染前完成
- Destroylmmediate 方法会立即销毁删除对象
2.请问下面代码 s 最终打印的值为多少?
1 | string s= string.Empty; |
答案: AC
原因: 主要考点
- Destroylmmediate 方法会立即将 GameObject 对象从场景上删除
- UnityEngine.Objecl 中对 ==、!=、!进行了重载,如果用!go 和 go == null 去判断对象是否为空,由于重载了,所以能够返回正确的结果 ture 和 false 但是本质上此时的 go 还不是真正意义上的的 null,所以如果用 go is null 或者 将其转换为万物之父 object(system.object)go == null 去判断时并不会为 true 这里的重点内容就是 UnityEngine.Object 中重载了 逻辑非 ! 、 == 、!= 运算符,因为使用他们来判断 null 是可以的,但是此时的 GarmeObject 在内部并不是真正意义的 null 我们在使用时最好手动置空
3.第一次执行 GameObject.Instantiate 时可能出现明显的卡顿如何解决该问题?
答案:
程序上 我们可以通过 Unity 自带的性能分析工具 Profiler 分析实例化时造成卡顿的原因程序上,一般我们可以从以下 3 个方面去优化它
- 相关资源加载:如果是由于资源加载带来的卡顿,我们可以在进入场景时进行资源预加载,总体思路就是将较大资源提前或者分帧加载
- 脚本初始化:实例化对象时,会同步执行它身上挂载所有脚本的初始化工作,我们可以策略性的改变一些初始化逻辑,尽量不要再 Awake 和 Start 中做较复杂的逻辑,或者将复杂逻辑提前或者分帧处理
- 对于会频繁使用的对象,我们可以使用缓存池
美术上 不能只追求好的美术效果,而不考虑资源的消耗,要根据项目的实际情况,来设定模型的骨骼数而数以及贴图的数量和大小上限。 在制作粒子特效时,粒子数、粒子面积、贴图等都要尽量少和小。美术上要遵循:用最少的资源做出做好的效果,不能一味的用性能去换效果,最终会得不偿失
4.Lua 如何实现面向对象的三大特性?
答案: 面向对象三大特性
- 封装:利用 table 进行封装利用元表和 _index 模拟继承关系
- 继承:设置子类的元表为父类,父类的 _index 为父类自己当子类身上找不到对应属性和方法时会查找元表的 index 中的内容,也就是会查找父类中的内容通过这种方式来模拟继承
- 多态:子类自己去实现带:的同名方法即可
5.Unity 使用 IL2CPP 打包时,我们应该注意什么?如何避免(可以举例说明)
答案: 使用 IL2CPP 打包时,最可能出现的问题就是代码裁剪,IL2CPP 会自动将它认为不会使用的代码裁剪掉,比如我们在使用 Lua 开发时其实会用到很多 UnityEngine 或者我们自己写的 C#代码,但是这些代码并不会在引擎中直接使用,都是在 Lua 中使用的,此时最容易出现的问题就是代码裁剪导致打包后出现异常和报错。
要避免 IL2CPP 的裁剪有 3 种方式,我们可以组合使用
- 设置打包时的裁剪等级
- 通过 xml 文件明确规定哪些内容不打包
- 在静态方法中显示调用不想被裁剪的内容