话不多说,全文用QA的方式展示,大致分为Unity、C#、其他三个部分。
Unity部分
1. unity脚本整个生命周期中比较重要的方法
- Awake 当脚本创建的时候调用,仅一次
- OnEnble 当对象变为可用和激活时调用
- Start 在任意一种update方法第一次调用前调用,仅一次
- Update 每一帧时调用
- FixedUpdate 固定频率调用,FixedUpdate多用于物理计算和更新
- OnDisable 当对象变为不可用和不激活时调用
- OnDistory 当对象销毁时调用
2. 简述prefab的用处
prefab相当于一个模板,在游戏运行时可以通过prefab实例化出多个实例对象。
3. 物体发生碰撞的必要条件
两个对象都必须带有Collider(碰撞器),其中一个物体还必须带有Rigidbody(刚体)。
4.unity中的碰撞器和触发器的区别
- 在collider组件上有属性IsTrigger来选择是否为触发器
- 碰撞器彼此之间不会进入对方,而触发器可以
- 碰撞器触发事件时会调用OnCollisionEnter、OnCollisionStay、OnCollisionExit函数。触发器触发事件时会调用OnTriggerEnter、OnTriggerStay、OnTriggerExit函数。
5. unity的光源有几种类型,分别是什么
- Directional Light:平行光源,如同现实中的太阳光源
- Point Light:点光源,如果现实中的蜡烛
- Spot Light:聚光灯光源,如同现实中的手电筒
- Area Light:区域光源
6. 什么是AssetBundle
AssetBundle是unity的一种资源包文件,我们可以将游戏中使用到的游戏资源打包成Assetbundle,在游戏运行时动态加载游戏资源。
7. 如何动态加载Assetbundle,以及加载过程
- 使用静态方法Assetbundle.LoadFromFile将Assetbundle文件从硬盘加载到内存中
- 之后通过获取到的Assetbundle变量,使用Assetbundle.LoadAsset方法获取Assetbundle中的资源
- 最后通过Instantiate方法实例化出对象
7.1 unity除了Assetbundle之外还有哪些动态加载资源的方式,并说说各自的优缺点
- 可以使用Resources.Load方法加载资源,资源需要放在unity默认的Resources目录中,但在游戏实际开发中并不建议使用。
- Resources方法的优点是可以不用打包,将资源放入目录就可以在运行时加载了。缺点是Resources目录无法动态更新,所以在游戏发布和版本升级上不适用。
- Assetbundle的优点是可以将资源分块加载,将相关联的资源打包成一个Assetbundle,便于资源的管理。缺点是在每次资源更新之后都需要重新打包。
8. 什么是渲染管线
渲染管线就是将场景内给定的三维物体、光源、纹理等信息绘制到摄影机的过程,也就是将三维场景绘制成二维图像的过程。
9. MipMap是什么?它的作用是什么?优点与缺点是什么?
- MipMap是一个针对纹理贴图的技术
- MipMap技术会根据摄影机距离模型的远近选择不同精度的贴图,以优化渲染效率
- 优点:优化现存带宽,提升渲染性能。 缺点:内存占用上升,使用MipMap会根据摄影机远近生成8张贴图。
10. LOD是什么?他的作用是什么?优缺点是什么?
- 全称Level Of Detail,中文翻译为“多层级细节”
- LOD会根据模型距离摄影机的距离,选择不同精度的模型,摄影机越近则选择高精度的模型,远则反之。
- 优点:提高渲染效率,优化了性能。 缺点:增加了内存占用。
11. 什么是Coroutines(协同程序)
在主线程运行的同时开启另一段逻辑处理,来协助当前程序的执行,协程很像多线程,但是不是多线程。
12. 在场景中放置多个Camera并同时处于活动状态会发生什么
游戏界面会看到多个摄影机图像的混合。
13.unity中UI的排序顺序是什么样的
- ScreenSpace-Overlay渲染模式的Canvas会渲染在最上层,之后根据Canvas的Sort Order值排序,值越大越在上层
- ScreenSpace-Camera渲染模式下会先根据Canvas绑定的Camera排序,Camera中的Depth值越大越在上层。之后根据Canvas的Order in Layer排序,值越大越在上层。
- 同是ScreenSpace-Overlay渲染模式或ScreenSpace-Camera渲染模式绑定同一个Camera的Canvas,根据Canvas中的SortOrder或OrderInLayer值来排序,数值越大越在上层。
- 同一个Canvas下的对象根据Hierarchy窗口下的顺序排序,越下面的对象越在上层。
14. 简述什么是Quaternion(四元数)
空
15. 什么是Darwcall,如何优化Darwcall
引擎每一次对GPU的调用的过程叫做Drawcall。
- 将相关的零散图片资源放到同一个Sprite中,这样多次Drawcall调用机会合并成一次
- 将使用同一图集的对象排序在一起,使用同一图集的对象会被一起绘制以减少Drawcall。
16. 什么是lightmap,有什么作用
lightmap就是事先烘焙好的光照贴图,这样可以避免使用实时光照,可以减少Drawcall提高性能。
17. RawImage和Image的区别
- RawImage可以显示任何类型的Texture,而Image只能显示Sprite
- RawImage支持UV Rect,Image支持Simple(简单)/Sliced(切片)/Tiled(平铺)/Filled(填充)
C#部分
1. 什么是GC(垃圾回收),如何避免和减少GC
GC全称garbage collector,是系统对不再被使用到的对象进行自动内存回收的机制。
- 将String换为StringBuilder
- 使用对象池,对于频繁创建销毁的对象可以采取缓存的策略
- 尽量减少new的使用
- 用struct代替class
2. struct和class有什么区别
struct是值类型,class是引用类型
3. 值类型和引用类型有什么区别
- 值类型的变量直接包含了数据,引用类型的变量值保存了指向数据的引用。
- 每个值类型变量都拥有自己复制的数据,每个值类型变量操作不会相互影响。而两个值类型变量可以指向同一个对象,操作一个变量可能会影响另一个变量的数据。
4. 什么是装箱、拆箱
装箱是让一个值类型隐式的转换为引用类型,从任何值类型到object类型
拆箱是让一个引用类型显式的转换为一个值类型,从object类型到任何值类型
5. 什么是委托
委托是值类型,通过委托可以将方法赋值给变量,或者作为参数传递给函数。委托和c++中的函数指针概念类似,但委托是类型安全的。
6.什么是面向对象
面向对象的核心思想包括抽象、封装、继承和多态。
抽象在于将逻辑化的编程语言以模块化的方式进行思考,使逻辑编程更符合人类原本的思维方式,对象化的思维方式本身就更符合人们平常的思维方式。
封装是使用编程语言本身的机制对代码进行模块化的封装,让代码以类的形式进行组织,让类具有自己的内部隐藏数据和外部操作接口。
继承则让类之间具有层次结构,可以让程序员层次化的组织代码工程。
7. 什么是静态构造函数
- 静态构造函数用于初始化静态数据,或执行仅需一次的特定操作。
- 静态构造函数在第一个实例创建前,或引用任一静态成员前调用。
- 静态构造函数由系统调用,不使用访问修饰符和不具有参数。
- 静态构造函数不能继承或重载。
图形部分
1.JPG、PNG、BMP、GIF有什么不一样,优点和缺点是什么
- JPG:有损压缩,。优点:文件数据小。缺点:会丢失图像数据
- PNG:无损压缩,画质中等,多用于程序、游戏。优点:可保存alpha通道。缺点:画质中等
- BMP:无损压缩,画质高,多用于壁纸、高清图片。优点:画质高完整保存图像数据。 缺点:文件数据大。
- GIF:无损压缩,画质低,存储多张图片可构成简单动画,多用于动图。优点:可存储动图。缺点:画质差。