前言:该篇文章主要是总结一些unity常用(涨姿势)的知识,整理出一些代表性的、有参考价值的题,真实面试题,,欢迎讨论,提升自己的同时,也能更好的去应对面试,就我自己的面试经历来说,通过面试最主要的还是能拿得出项目来,并且说出自己所担任模块有遇到哪些困难,并且是怎么解决的,这些就是你面试比较关键一些点了。
说了这么多,下面马上给大家分享面试题。
还需要其他的面试题可以关注转发并私信我回复“01”即可获取我所有Unity面试题资料。
Unity面试题汇总
1. 什么是协同程序?
在主线程运行的同时开启另一段逻辑处理,来协助当前程序的执行,协程很像多线程,但是不是多线程,Unity的协程是在每帧结束之后去检测yield的条件是否满足。
2. Unity3d中的碰撞器和触发器的区别?
碰撞器是触发器的载体,而触发器只是碰撞器身上的一个属性。当Is Trigger = false时,碰撞器根据物理引擎引发碰撞,产生碰撞的效果,可以调用OnCollisionEnter/Stay/Exit函数;当Is Trigger = true时,碰撞器被物理引擎所忽略,没有碰撞效果,可以调用OnTriggerEnter/Stay/Exit函数。如果既要检测到物体的接触又不想让碰撞检测影响物体移动或要检测一个物件是否经过空间中的某个区域时就可以用到触发器。
3. 物体发生碰撞的必要条件?
两个物体都必须带有碰撞器(Collider),其中一个物体还必须带有Rigidbody刚体,而且必须是运动的物体带有Rigidbody脚本才能检测到碰撞。
4. 请简述ArrayList和List<T>的主要区别?
ArrayList存在不安全类型,会把所有插入其中的数据都当做Object来处理,装箱和拆箱的操作耗费时间。
List<T>是泛型集合,指定了元素的类型,不需要装箱和拆箱的操作。
5. 如何在不同的工程之间安全的迁移asset数据?
三种方法:
1. 将Assets目录和Library目录一起迁移
2. 导出包,export Package
3. 用unity自带的assets Server功能
6. OnEnable、Awake、Start运行时的发生顺序?哪些可能在同一个对象周期中返利的发生?
Awake->OnEnable->Start,OnEnable在同一周期中可以反复的发生。
7. MeshRender中material和sharematerial的区别?
修改sharedMaterial将改变所有物体使用这个材质的外观,并且也改变储存在工程里的材质设置,不推荐修改由sharedMaterial返回的材质,如果你想修改渲染器的材质,使用material替代。
8. Unity提供了几种光源,分别是什么?
四种:
平行光: Directional Light
点光源: Point Light
聚光灯: Spot Light
区域光源: Area Light
9. 简述一下对象池,你觉得在FPS游戏里哪些东西适合使用对象池?
对象池就是存放需要被反复调用的资源的一个空间,当一个对象会大量生成的时候,如果每次都销毁创建会很费时间,通过对象池把暂时不用的对象放到一个池中(也就是一个集合),当下次要重新生成这个对象的时候先去池中查找一下是否有可用的对象,如果有的话就直接拿出来使用,不需要再创建,如果池中没有可用的对象,才需要重新创建,利用空间换时间来达到游戏的高速运行效果,在FPS游戏中要常被大量复制的对象包括子弹,敌人,粒子等。
10. CharacterController和Rigidbody的区别?
Rigidbody具有完全真实物理的特性,是Unity中物理系统最基本的一个组件,包含了常用的物理我,而CharacterController可以说是受限的Rigidbody,具有一定的物理效果但不是完全真实的,是Unity为了使开发者能方便的开发第一人称视角的游戏而封装的一个组件。
11. 简述Prefab的用处?
在游戏运行时实例化,Prefab相当于一个模板,对你已经有的素材,脚本,参数做一个默认的配置,以便于以后的修改,同时Prefab打包的内容简化了导出的操作,便于团队的交流。
12. 请简述sealed关键字用在类声明与函数声明时的作用?
Sealed修饰的类为密封类,类声明时可防止其他类继承此类,在方法中声明则可防止派生类重写此方法。
13. 请简述private,public,protexted,internal的区别?
Public:对和成员都公开,无限制访问。
Private:仅对本类公开。
Protected:对本类和派生类公开。
Internal:只能在包含该类折程序集中访问该类。
14. 使用Unity3d实现2d游戏,有几种方式?
1. 使用本身的GUI,在Unity4.6以后出现的UGUI。
2. 把摄像机的Projection(投影)值调 为Orthographic(正交投影),不考虑Z轴。
3. 使用第三方插件,如NGUI,2DToolKit等
15. 在物体发生碰撞的整个过程中,有几个阶段,分别列出对应的函数?
共有三个阶段:
碰撞发生时:OnCollisionEnter
碰撞过程中:OnCollisionStay
碰撞结束时:OnCollisionExit
16. Unity3d的物理引擎中,有几种施加力的方式,分别描述出来?
一共有四种:
AddForce 添加力
AddExplosionForce 添加爆炸力
AddForceAtPosition 在指定位置上添加力
AddRelativeForce 添加相对力
17. 什么叫做链条关节?
Hinge Joint,可以模拟两个物体间用一要链条连接在一起的情况,能保持两个物体在一个固定距离内部相互移动而不产生作用力,但是达到固定距离后就会产生拉力。
18. 物体自身旋转使用的函数是?
Transform.Rotate();
19. Unity3d提供了一个用于保存和读取数据的类(PlayerPrefs),请列出保存和读取数据的三种类型,以及对应的函数?
整型:PlayerPrefs.SetInt(); PlayerPrefs.GetInt();
浮点型:PlayerPrefs.SetFloat(); PlayerPrefs.GetFloat();
字符串:PlayerPrefs.SetString(); PlayerPrefs.GetString();
20. Unity3d脚本从唤醒到销毁有着一套比较完整的生命周期,请列出系统自带的几个重要的方法?
Awake->OnEnable->Start->Update->FixedUpdate->LateUpdate->OnGUI->OnDisable->OnDestroy
21. 物理更新一般放在哪个系统函数里?
FixedUpdate,固定每帧绘制时执行一次,和Update不同的是FixedUpdate是固定时间间隔执行,不受渲染的影响。
22. 在场景中放置多个Camera并同时处于活动状态会发生什么?
与Camera的Depth值有关,先渲染Depth值低的,再渲染Depth值高的。
23. 如何销毁一个UnityEngine.Object及其子类?
使用Destroy()方法。
24. 请描述为什么Unity3d中会发生在组件上出现数据丢失的情况?
一般是组件上绑定的物体对象被删除了。
25. LOD是什么,优缺点是什么?
LOD(Level of detail)多层次细节,是最常用的游戏优化技术,它按照模型的位置和重要程序决定物体渲染的资源分配,降低非重要物体的页数和细节度,从而获得高效率的渲染运算,缺点是增加了内存。
26. MipMap是什么,有什么作用?
MipMap技术有点类似于LOD技术,但不同的是,LOD针对的是模型资源,而MipMap针对的是纹理贴图资源,使用MipMap后,贴图会根据摄像机距离的远近选择使用不同精度的贴图。
缺点:会占用内存,因为MipMap会根据摄像机远近不同而生成对应的8个贴图,所以会增加内存的消耗。
优点:会优化显存带宽,用来减少渲染,因为可以根据实际情况选择适合的贴图来渲染,距离摄像机越远显示的贴图像素越低,反之,像素越高!
27. 请描述Interface和abstract class 的不同?
接口不能包含构造析构函数、字段,可以有方法的声明但不能有方法的实现,子类继承接口后必须实现接口中的所有方法。
抽象类可以包含构造析构函数、字段,属性,可以有方法的声明也可以有方法的实现,只有声明没有实现的方法要声明为抽象方法,子类继承抽象类后可以重写抽象类中的方法也可以直接使用抽象类中的方法。
28. .net与mono的关系?
Mono是一个跨平台工具,类似于java的虚拟机,.net只能在windows平台下运行,mono可以实现跨平台,可以运行于linux,unix,macos等系统下。
29. 简述Unity3d支持的作为脚本的语言的名称?
Unity支持的脚本语言主要有JavaScript,C#,Boo,基于Mono的.Net平台上运行,可以使用.net库,这也为xml、数据库、正则表达式等问题提供了很好的解决方案。Unity里的脚本都会经过编译,他们的运行速度也很快。这三种语言的功能和运行速度是一样的,区别主要体现在语言特性上。
30. Unity中用于记录节点空间几何信息的组件名称及其父类名称是?
Transform,父类是Component
31. 向量的点乘、叉乘以及归一化的意义?
1. 点乘描述了两个向量的相似程度,结果越大两向量越相似,还可以表示投影。
2. 叉乘得到的向量垂直于原来的两个向量,用于求法向量。
3. 归一化主要用在只关心方向,不关心大小的时候。
32. 为何大家都在移动设备上寻求unity原生GUI的替代方案?
因为UGUI不美观,OnGUI很耗费时间,效率不高,使用不方便。
33. 请简述如何在不同分辨率下保持UI的一致性?
NGUI很好的解决了这一点,屏幕分辨率的自适应性,原理就是计算出屏幕的宽高比跟原来的预设的屏幕分辨率求出一个对比值 ,然后修改摄像机的size。
UGUI通过锚点和中心点和分辨率也解决了这个问题。
34. 什么是LightMap?
LightMap:就是指在三维软件里事先打好光,然后渲染把场景各表面的光照输出到贴图上,最后又通过引擎贴到场景上,这样就使物体有了光照的感觉。
35. Unity和Cocos2d的区别?
Unity支持C#,JavaScript,Boo语言,cocos2d-x支持c ,html5,lua等语言。
Cocos2d开源且免费,Unity闭源且收费
Unity支持IOS,Android,Flash,Windows,Mac等平台的游戏开发,cocos2d-x支持IOS,Android,wp等平台。
Unity也可以做2D游戏,但对3D的支持更好,cocos也可以做3D游戏,但对2D的支持更好。
36. C#和C 的区别?
C 是编译型的语言,C#是半编译半解释型的语言,会先编译成中间代码,然后通过解释器解释执行。C#在C 的基础上进行了更多的封装,取消了指针类型。C 的资源需要手动释放,C#的资源由垃圾回收器GC自动回收。
37. 结构体和类有什么区别?
结构体是一种值类型,存储于栈中,而类是引用类型,存储于堆中。
结构体的成员默认是public,类的变量和常量默认是private,其他成员是public。
结构体隐式继承自ValueType类,而不能继承任何其他类型,类则可以继承处ValueType以外的任何类。
结构体无法被继承,类则可以。
38. Ref参数和out参数是什么?有什么区别?
Ref参数是引用,out参数是输出参数,两者都是传入变量的地址,ref传入的数据有效,out传入的数据无效,ref可以在函数内改变其值,也可以不改变,out则必须在函数中赋值。
39. C#的委托是什么?有何用处?
委托类似于c/c 中的函数指针,它能够引用函数,但在C#中委托是一个对象,且是安全的,一个委托类型的变量可以引用一个或多个方法,这些方法由委托存放于一个调用列表中,当调用一个委托类型的变量即相当于依次调用它的调用列表中的方法。C#中提供了两个泛型委托Action和Func,区别是Action是无返回值的,Func是有返回值的。
40. C#中的排序方式有哪些?
选择排序,冒泡排序,快速排序,插入排序,希尔排序,归并排序
41. 射线检测碰撞物的原理是?
射线是3D世界中一个点向一个方向发射的一条无终点的线,在发射轨迹中与其他物体发生碰撞时,它将停止发射。
42. Unity中,摄像机的Clipping Planes的作用是什么?调整Near,Far两个值 时,应该注意什么?
剪裁平面,从相机到开始渲染和停止渲染之间的距离。
43. 如何让已经存在的GameObject在LoadLevel后不被卸载掉?
Void Awake()
{
DontDestroyOnLoad(transform.gameObject);
}
44. 请简述GC(垃圾回收)产生的原因,并描述如何避免?
原因:回收堆上的内存
避免:
1. 减少new产生对象的次数
2. 使用公用的对象(静态成员)
3. 将String换为StringBuilder.
45. 反射的实现原理?
反射是审查元数据并收集关于它的类型信息的能力。
实现原理:在运行时根据程序集及其中的类型得到元数据。
实现步骤:
1. 导入using System.Reflection;
2. Assembly.Load(“程序集”); //加载程序集,返回类型是一个Assembly
3. 得到程序集中所有类的名称
Foreach(Type type in assembly.GetTypes())
{
String t = type.Name;
}
4. Assembly.GetType(“程序集.类名”); //获取当前类的类型
5. Activator.CreateInstance(type); //创建此类型实例
6. MethodInfo mInfo = type.GetMethod(“方法名”); //获取当前方法
7. M.Info.Invoke(null,方法参数);
46. 简述四元数的作用,四元数对欧拉角的优点?
四元数用于表示旋转。
相对于欧拉角的优点:
1. 能进行增量旋转
2. 避免万向节死锁
3. 给定方位的表达方式有两种,互为负(欧拉角有无数种表达方式)
47. 移动相机动作在哪个函数里,为什么在这个函数里?
LateUpdate,是在所有的update结束后才调用,比较适合用于命令脚本的执行,不然有可能出现摄像机已经推进,但视角里未有角色的空帧出现。
48. GPU的工作原理?
简而言之,GPU的图形(处理)流水线完成如下的工作:(并不一定是按照如下顺序) 顶点处理:这阶段GPU读取描述3D图形外观的顶点数据并根据顶点数据确定3D图形的形状及位置关系,建立起3D图形的骨架。在支持DX8和DX9规格的GPU中,这些工作由硬件实现的Vertex Shader(定点着色器)完成。 光栅化计算:显示器实际显示的图像是由像素组成的,我们需要将上面生成的图形上的点和线通过一定的算法转
换到相应的像素点。把一个矢量图形转换为一系列像素点的过程就称为光栅化。例如,一条数学表示的斜线段,最终被转化成阶梯状的连续像素点。 纹理帖图:顶点单元生成的多边形只构成了3D物体的轮廓,而纹理映射(texture mapping)工作完成对多变形表面的帖图,通俗的说,就是将多边形的表面贴上相应的图片,从而生成“真实”的图形。TMU(Texture mapping unit)即是用来完成此项工作。 像素处理:这阶段(在对每个像素进行光栅化处理期间)GPU完成对像素的计算和处理,从而确定每个像素的最终属性。在支持DX8和DX9规格的GPU中,这些工作由硬件实现的Pixel Shader(像素着色器)完成。 最终输出:由ROP(光栅化引擎)最终完成像素的输出,1帧渲染完毕后,被送到显存帧缓冲区。
总结:GPU的工作通俗的来说就是完成3D图形的生成,将图形映射到相应的像素点上,对每个像素进行计算确定最终颜色并完成输出。
49. 什么是渲染管道?
是指在显示器上为了显示出图像而经过的一系列必要操作。渲染管道中的很多步骤,都要将几何物体从一个坐标系中变换到另一个坐标系中去。主要步骤有:
本地坐标->视图坐标->背面裁剪->光照->裁剪->投影->视图变换->光栅化
50. 如何优化内存?
有很多种方式,例如:
1. 压缩自带类库。
2. 将暂时不用的以后还需要使用的物体隐藏起来而不是直接Destroy掉。
3. 释放AssetBundle占用的资源。
4. 降低模型的片面数,降低模型的骨骼数量,降低贴图的大小。
5. 使用光照贴图,使用多层次细节(LOD),使用着色器(Shader),使用预设(Prefab)。
6. 代码中少产生临时变量。
,