Unity客户端常见面试题(收集的)

一、什么是渲染管道?

是指在显示器上为了显示出图像而经过的一系列必要操作。主要步骤有:把物体从本地坐地转换到世界坐标->视图 坐标->剪裁空间->投影->视图变换->光栅化(alpha测试、模板测试、深度测试)->写到帧缓冲区(frame buffer)

 二:如何优化内存?

1.压缩自带类库;2.将暂时不用的但以后需要用的物体先隐藏起来而不是销毁掉;3.释放AssetBundle占用的资源;4.降低模型的片面数、骨骼数,降低贴图额大小5.使用光照贴图,多层次细节(LOD)

三、动态加载资源的方式?

1.Resources.Load();

2.AssetBundle: AssetBundles 技术的主要的目的是在需要的时候能够从远端的服务器上按需请求特定的资源,并加载到游戏中。

AssetBundle分组策略:

1,把经常更新的资源放在一个单独的包里面,跟不经常更新的包分离 
2,把需要同时加载的资源放在一个包里面 
3,可以把其他包共享的资源放在一个单独的包里面 
4,把一些需要同时加载的小资源打包成一个包 
5,如果对于一个同一个资源有两个版本,可以考虑通过后缀来区分 v1 v2 v3 unity3dv1 unity3dv2

四、什么是协同程序?

协同程序是主线程运行的同时开启另一段逻辑处理,来协助当前程序的执行,协同程序像多线程,但不是多线程(除主线程外的线程不能访问unity的组件、脚本等),Unity的协程是在每帧结束后去检测yield的条件是否满足。

五、物体碰撞的必要条件?

两个物体都必须带有碰撞体,其中运动的物体必须带有rigidbody(刚体)才能检测到碰撞。

六、碰撞器和触发器的区别?

碰撞器是触发器的载体,触发器是碰撞器上的一个属性(is trigger);is trigger=false时,碰撞器根据物理引擎引发碰撞效果,可以调用OnCollisionEnter/Stay/Exit函数;当is trigger=true时,碰撞被忽略,没有碰撞效果,可以调用OnTriggerEnter/Stay/Exit函数,触发器一般用于要检测一个物体是否经过空间中的某个区域。

七、ArrayList 和 List的主要区别?

都继承IList接口

ArrayList:ArrayList插入不同类型的数据时允许的,因为它会把所有插入的数据都当做Object类型处理(会引发装箱拆箱操作(引用类型、值类型相互转换),带来很大的性能损耗),所以用ArrayList处理数据时,可能会报类型不匹配的错误,也就是说ArrayList不是类型安全的。

List:声明List集合时,需要为其声明List集合内数据的对象类型(List<string> strList = new List<string>())

八、Unity中的生命周期?

Awake->OnEnable->Start->Update->FixedUpdate->LateUpdate->OnGUI->OnDisable->OnDestroy

九、如何安全的在不同的工程间安全的迁移asset数据?
1.将Asset目录和library目录一起迁移

2.导出包,用export package

3.用unity自带的assets server功能

十、MeshRender中material和shaderMaterial的区别?

修改shaderMaterial将改变所有使用这个材质的物体的外观,并且也改变存储在工程中的材质。而material则为这个物体生成一个新的材质。

十一、简述对象池?

对象池是存放需要被反复调用资源的一个空间,当一个对象会大量生成的时候,如果每次都销毁、创建会很费时间,通过对象池把暂时不用的对象放到一个池中(也就是一个集合中),当下次要重新生成这个对象的时候,先去对象池中查看是否有可用的对象,如果有则直接拿出来使用,如果没用,才需要重新创建,利用空间换时间,在fps游戏中要经常被大量使用复制的对象,如子弹等可以放入对象池中。

十二、CharacterController 和Rigidbody的区别?

Rigidbody具有完全真实物理的特性,Unity中物理系统最基本的一个组件,包含了常用的物理特性,而CharacterController 可以说是受到限制的rigidbody,具有一定的物理特性但不完全真实,是unity为了使开发者方便的开发而封装的一个组件。

十三、Prefab(预制体)的作用?

在游戏运行时实例化,prefab相当于一个模板,对已有的素材、脚本、参数做一个默认的配置,以便以后的修改 ,同时prefab打包的内容简化了导出的操作,方便团队的交流。

十四、sealed关键字用在类声明和函数声明时的作用?

sealed修饰的类为密封类,可防止其他类继承此类;在方法中声明则可防止派生类重写此方法。

十五、c#抽象类和接口的区别?

抽象类:可以有一些方法的具体定义,子类不一定需要重写

接口:只定义了方法,子类必须重写接口中的所有方法

十六、Unity提供的一个用于保存和读取数据的类(PlayerPrefs),保存和读取整形数据的函数?

PlayerPrefs.SetInt("name",value); PlayerPrefs.GetInt("name");

十七、简述FixedUpdate?

FixedUpdate每固定帧绘制时执行一次,和Update不同的是FixedUpdate是渲染帧执行,如果渲染效率低下,FixedUpdate调用次数就会减少;FixedUpdate一般用于物理引擎的计算,Update比较适合做控制。

十八、LOD是什么,MipMap是什么?

LOD(level of detail)多层次细节,是常用的游戏优化技术。它按照模型的位置和重要程度决定物体渲染的资源分配,降低非重要物体的面数和细节度,从而获得高效率的运算;缺点是增加内存。

MipMap:是针对纹理贴图的,使用了mipmap,贴图会根据摄像机距离模型的远近而调整不同质量的贴图显示。

十九、.Net与Mono的关系?

mono是.net的一个开源跨平台工具,就类似于java虚拟机,java本身不是跨平台语言,但运行在虚拟机上就能够实现跨平台了。.net只能在windows下运行,mono可以实现跨平台跑,可以允许于linux、mac os等。

二十、向量点乘、叉乘的意义?

点乘:描述了两个向量的相似度,结果越大两向量越相似,还可以表示投影(其中一个被投影的向量为单位向量)

叉乘:叉乘得到垂直于原来两个向量的向量

二十一、Unity的屏幕适配?

这篇文章很好,参考

http://www.jianshu.com/p/95cb4621206e

二十二、什么是lightMap?

LightMap:就是指在三维软件里实现打好光,然后渲染把场景各表面的光照输出到贴图上,最后通过引擎贴到场景上,使物体有了光照的感觉。优点是可以通过较少的性能消耗使静态场景看上去更加真实,丰富,更加具有立体感;缺点是不能用来实时地处理动态光照。

二十三、C#中结构体和类的区别?

结构体是一种值类型,用于存储数据的值;类是属于引用类型,用于存储对实际数据的引用。结构体是当成值来使用,类则是通过引用来对实际数据操作。

二十四、ref参数和out参数的区别?

对参数使用了ref或out都是通过关键字找到定义在主函数里面变量的内存地址;不同点在于ref的参数作为输入参数,必须初始化,out参数作为输出参数,必须在函数里赋值。

二十五、C#委托是什么、用处?和事件的区别?

委托(delegate关键字)当作一个类看待,是对一组方法的列表的引用。用处:使用委托可以将方法引用封装在委托对象内,然后可以将该委托对象作为其他函数的参数传递。事件(event关键字):在定义的委托对象前加event关关键字,如

 public delegate void FunHandleEvent();//声明一个委托 

 public FunHandleEvent funHandleEvent;//定义一个委托对象

    public event FunHandleEvent FunEvent;//定义一个事件

区别:

1.事件在类外绑定事件只能用“+=”(“-=”解绑),不能使用‘=’绑定;如果在类内部绑定事件可以用‘=’;  

2.委托在类内类外都可以用"+="、"-="、"=";

3.事件的调用(执行)只能在类内调用;委托(公有)在类内类外都可以调用

 二十六、射线碰撞检测原理?

射线是3d世界中一个点向一个方向发射一条无重点的线,在发射轨迹中与其他物体发射碰撞时,它将停止发射。

二十七、Unity中,相机的Clipping Plane的作用?Near、Far?

Clipping Plane;用来剪裁平面。Near、Far表示从相机开始渲染到停止渲染之间的距离。

二十八、如何让已经存在的GameObject在LoadLevel后不被卸载?

DontDestroyOnLoad(transform.gameObject);

二十九、GC(垃圾回收)产生的原因,如何避免?

原因:GC回收堆上的内存;触发GC的几种情况:1.GC自动执行(频率和平台有关)2.在堆上分配内存的时候没有适合的内存大小或空间不够 3.主动执行GC

避免:1.减少产生在堆上分配内存的对象的次数 2.使用静态成员 3.用StringBuilder代替String

三十、使用放射调用方法?

MethodInfo mi = 类对象.GetType().GetMethod(methodName);//根据方法名得到方法信息

object[] parameters = new object[] { 参数1,参数2,.... }; //设置方法的参数
object o = mi.Invoke(类对象, parameters); //调用方法

三十一、四元数对欧拉角的优点?

四元数相对于欧拉角的优点:1.能进行增量旋转 2.能避免万向锁 3.给定方位的表达式有两种,互为正负,欧拉角有无数种表达方式 

三十二、Unity中移动相机动作一般放哪个函数,为什么?

一般放在LateUpdate,LateUpdate是在所有update结束后才调用,比较适合命令脚本的执行。一般在update操作完后才进行相机的跟进,不然可能出现相机已经推进,视角里还未出现角色的情况出现。

三十三、游戏动画有哪几种,及其原理?

关节动画:把角色分成若干独立部分,一个部分对应一个网格,各个部分的动画连接成整体的动画。

骨骼动画:骨骼按角色特点组成一定层次结构,有关节相连,可做相对运动。

关键帧动画:在动画序列的关键帧里记录各个顶点的原位置以及改变量,然后插值运算实现动画效果。

三十四、各种光照的计算公式?

光照方程=环境光+漫反射+镜面反射;*

漫反射=Kd * lightColor * max(dot(normal,lightDir),0);//Kd:漫反射系数 lightColor:光照颜色  normal:单位法向量 lightDir:指向光源的方向(单位向量)

镜面反射(Phong光照模型)=Kd * lightColor * pow(max(dot(viewDir,i-2n(n*i)),0),Mgls); //viewDir是指向人眼的方向(单位向量)i-2n(n*i):是入射光线的反射光线方向 Mgls:材料的光泽度(控制高光的范围)

镜面反射(BlinnPhong光照模型)=Kd * lightColor * pow(max(dot(normal,h),0),Mgls); //h:是lightDir和viewDir两个向量的和(取单位向量)

三十五、当一个细小的物体高速撞向两一个较大的物体,会出现什么情况,如何避免?

出现穿透(碰撞检测失败);

避免:1.增大细小物体的碰撞体 2.使用射线检测,检测距离 3.代码限制

三十六、StringBuilder和String的区别?

String类型是个不可变的uix,每次对String对象进行改变时,都需要生成一个新的String对象,然后将指针指向一个新的对象,增加内存垃圾;StringBuilder只在原来的字符串上进行修改。

三十七、Unity 着色器分类?

表面着色器,顶点片元着色器,固定管线着色器

三十八、C#堆和栈的区别?

栈:空间由系统分配,空间有限,使用完毕立即被清除

堆:空间是手动申请的,空间由很大的自由区,使用完毕不会立即被清除,通过GC回收空间

三十九、值类型和引用类型的区别?

1.值类型存储在栈上,引用类型存储在堆上;2.值类型存取速度快;

3.值类型表示实际数值,引用类型表示指向存储在内存种的数据的引用;

4.值类型继承System.ValueType,引用类型继承Sytem.Object;

5.栈的内存空间是自动释放的,堆上分配的空间通过GC来释放 

6.值类型变量直接存放实际的数据,引用类型的变量存放的是数据的地址,即对象的引用。

四十、概述序列化?

序列化简单理解成把对象转换成容易传输的格式的过程。

四十一、Unity在移动设备上优化资源的方法?

1.使用assetbundle,实现资源分离和共享,同时也可以实现资源的在线更新;

2.减少顶点数 3.减少动态灯光使用的数量 4.使用轻量级的粒子系统 5.控制模型骨骼数量

6.尽量使用animation替代animator

四十二、将camera组件的clearFlags选项设置为DepthOnly的用处?

如果勾选了depthOnly,那么摄像机就只会渲染看得见的物体。

四十三、在编辑场景时,将GameObject设置为Static的作用?

设置游戏对象为Static时,这些部分被静态物体挡住而不可见时,会剔除(或禁用)网格对象。

四十三、Unity shader中,Blend SrcAlpha OneMinusSrcAlpha的作用/

表示alpha混合。公式:最终颜色=源颜色*源透明值+目标颜色*(1-源透明值)

猜你喜欢

转载自www.cnblogs.com/darkif/p/10089515.html