写在前面:
这份题是网上看到的,最先是哪个博主发的不太清楚(侵权立删),很多都是直接复制粘贴了也没表明出处。我自己简单地排了一下版,方便观看学习,后面看到其他的题会添加上,祝学习愉快!
Unity3d脚本从唤醒到销毁有着一套比较完整的生命周期,请列出系统自带的几个重要的方法。
Awake -->OnEnable -->Start -->Update -->FixedUpdate -->LateUpdate
-->OnGUI -->OnDisable -->OnDestroy什么是协同程序?
在主线程运行的同时开启另一段逻辑处理,来协助当前程序的执行,协程很像多线程,但是不是多线程,Unity的协程是在每帧结束之后去检测yield的条件是否满足。方法返回值用 IEnumerator ,调用协程方法用 StartCoroutine("xxx")。Unity3D的协程和C#线程之间的区别是什么?
多线程就是同时运行多个线程 ,而协程,在任一指定时刻只有一个协程在运行,并且这个正在运行的协程只在必要时才被挂起。除主线程之外的线程无法访问Unity3D的对象、组件、方法。
StartCoroutine(协同程序)和LoadLevelAsync(异步加载关卡)都是后台加载场景的方法。 所谓协同,就是当你在StartCoroutine的函数体里处理一段代码时,利用yield语句等待执行结果,这期间不影响主程序的继续执行,可以协同工作。Unity中的碰撞器和触发器的区别?
碰撞器是触发器的载体,而触发器只是碰撞器身上的一个属性。当Is Trigger=false时,碰撞器根据物理引擎引发碰撞,产生碰撞的效果,可以调用OnCollisionEnter/Stay/Exit函数;当Is Trigger=true时,碰撞器被物理引擎所忽略,没有碰撞效果,可以调用OnTriggerEnter/Stay/Exit函数。如果既要检测到物体的接触又不想让碰撞检测影响物体移动或要检测一个物件是否经过空间中的某个区域这时就可以用到触发器物体发生碰撞的必要条件?
两个物体都必须带有碰撞器组件(Collider),其中一个物体还必须带有Rigidbody刚体组件,而且必须是运动的物体带有Rigidbody脚本才能检测到碰撞请简述ArrayList和List的主要区别?
ArrayList存在不安全类型(ArrayList会把所有插入其中的数据都当做Object来处理),调用时会有装箱与拆箱的操作(费时),List是泛型类,功能跟ArrayList相似,但不存在ArrayList所说的问题。如何安全的在不同工程间安全地迁移asset数据?三种方法
- 将Assets目录和Library目录一起迁移
- 导出包,export Package
- 用unity自带的assets Server功能
MeshRender中material和sharedmaterial的区别?
修改其中一个物体的sharedMaterial将改变所有物体使用这个材质的外观,并且储存在项目文件夹的材质本身也会随之变化,故不推荐修改由sharedMaterial返回的材质。如果你想修改渲染器的材质,使用material替代。Unity提供了几种光源,分别是什么?
平行光:Directional Light
点光源:Point Light
聚光灯:Spot Light
区域光源:Area Light简述一下对象池,你觉得在FPS里哪些东西适合使用对象池?
对象池就存放需要被反复调用资源的一个空间,当一个对象会大量生成的时候如果每次都销毁创建会很费时间,通过对象池把暂时不用的对象放到一个池中(也就是一个集合),当下次要重新生成这个对象的时候先去池中查找一下是否有可用的对象,如果有的话就直接拿出来使用,不需要再创建,如果池中没有可用的对象,才需要重新创建,利用空间换时间来达到游戏的高速运行效果,在FPS游戏中要常被大量复制的对象包括子弹,敌人,粒子等。CharacterController和Rigidbody的区别?
Rigidbody具有完全真实物理的特性,Unity中物理系统最基本的一个组件,包含了常用的物理特性,而CharacterController可以说是受限的Rigidbody,具有一定的物理效果但不是完全真实的,是Unity为了使开发者能方便的开发第一人称视角的游戏而封装的一个组件。简述prefab的用处
在游戏运行时实例化,prefab相当于一个模板,对你已经有的素材、脚本、参数做一个默认的配置,以便于以后的修改,同时prefab打包的内容简化了导出的操作,便于团队的交流。请简述sealed关键字用在类声明时与函数声明时的作用
sealed修饰的类为密封类,密封类可以继承其他类但不能被继承;密封的方法不能被子类重写。请简述private,public,protected,internal的区别。
public:对任何类和成员都公开,无限制访问
private:仅对该类公开
protected:对该类和其子类公开
internal:只能在包含该类的程序集中访问该类
程序集:对于一些大型的项目,通常由很多个DLL文件组成,引用了这些DLL,就能访问DLL里面的类和类里面的方法,这个DLL文件的程序就是一个程序集。
。
什么叫做链条关节?
Hinge Joint,可以模拟两个物体间用一根链条连接在一起的情况,能保持两个物体在一个固定距离内部相互移动而不产生作用力,但是达到固定距离后就会产生拉力。物理更新一般放在哪个系统函数里?
FixedUpdate。因为update跟当前平台的帧数有关,而FixedUpdate是固定帧数调用,所以处理物理逻辑的时候要把代码放在FixedUpdate。固定时间间隔执行 可以在edit->project setting->time设置。在场景中放置多个Camera并同时处于活动状态会发生什么?
游戏界面可以看到很多摄像机的混合。如何销毁一个UnityEngine.Object及其子类?
使用Destroy()方法;请描述为什么Unity3d中会发生在组件上出现数据丢失的情况?
一般是组件上绑定的物体对象被删除了LOD是什么,优缺点是什么?
LOD(Level of detail)多层次细节,是最常用的游戏优化技术。它按照模型的位置和重要程度决定物体渲染的资源分配,降低非重要物体的面数和细节度,从而获得高效率的渲染运算。缺点是增加了内存。MipMap是什么,作用?
MipMapping:在三维计算机图形的贴图渲染中有常用的技术,为加快渲染进度和减少图像锯齿,贴图被处理成由一系列被预先计算和优化过的图片组成的文件,这样的贴图被称为MipMap。作用优化了性能,缺点内存占用变大。什么是LightMap?
LightMap是一张贴图(texture),存储了从场景(scene)中直接烘焙而来的灯光信息,通过这张贴图,我们可以减少draw call,提升我们游戏的性能请描述Interface(接口)与抽象类(abstract)之间的不同
两者都不能被实例化。
抽象类中可以存在抽象成员和实例成员,继承了抽象类的子类必须重写所有的抽象成员,实例成员可不必重写;
接口中的成员不能有任何的实现(方法不能有方法体),继承了接口的类必须实现其所有的方法;
一个类可继承多个接口但只能继承一个类。.Net与Mono的关系?
mono是.net的一个开源跨平台工具,就类似Java虚拟机,java本身不是跨平台语言,但运行在虚拟机上就能够实现了跨平台。.net只能在windows下运行,mono可以实现跨平台跑,可以运行于Linux,Unix,Mac OS等。向量的点乘、叉乘以及归一化的意义?
点乘(Vector3.Dot)得到一个值,描述了两个向量的相似程度,结果越大两向量越相似,还可表示投影;
叉乘(Vector3.Cross)得到一个垂直于原来的两个向量的新向量;
标准化向量(归一化):用在只关系方向,不关心大小的时候。为何大家都在移动设备上寻求U3D原生GUI的替代方案?
OnGUI不美观,很耗费时间,效率不高,使用不方便。请简述如何在不同分辨率下保持UI的一致性
NGUI和UGUI里面的锚点都可以保持UI位置相对与某一点上位置不发生变化,大小也不会改变。NGUI中的UIRoot上有一个属性Scaling Style可以设置跟随固定分辨率来缩放UI的大小,位置相对不变;UGUI上Canvas的UI Scale Mode选择Scale with screen size同样。类与结构体的区别?(引用类型与值类型的区别)
类是引用类型。 创建类的对象后,向其分配对象的变量仅保留对相应内存的引用。 将对象引用分配给新变量后,新变量会引用原始对象。 通过一个变量所做的更改将反映在另一个变量中,因为它们引用相同的数据。
结构是值类型。 创建结构时,向其分配结构的变量保留结构的实际数据。 将结构分配给新变量时,会复制结构。 因此,新变量和原始变量包含相同数据的副本(共两个)。 对一个副本所做的更改不会影响另一个副本。ref参数和out参数是什么?有什么区别?
out 参数:额外返回值,返回多个不同类型的值时,考虑使用out 参数,out参数在方法里面一定要赋值,方法外可不用赋值;ref参数:将一个变量带入一个方法中进行改变,改变后再将改变后的值带出方法,ref参数要求在方法外必须赋值,而方法内可不赋值C#的委托是什么?有何用处?
委托类似于一种安全的指针引用,在使用它时是当做类来看待而不是一个方法,相当于对一组方法的列表的引用。用处:使用委托使程序员可以将方法引用封装在委托对象内。然后可以将该委托对象传递给可调用所引用方法的代码,而不必在编译时知道将调用哪个方法。与C或C++中的函数指针不同,委托是面向对象,而且是类型安全的。射线检测碰撞物的原理是?
射线是3D世界中一个点向一个方向发射的一条无终点的线,在发射轨迹中与其他物体发生碰撞时,它将停止发射 。Unity中,照相机的Clipping Planes的作用是什么?调整Near、Fare两个值时,应该注意什么?
剪裁平面 。从相机到开始渲染和停止渲染之间的距离。如何让已经存在的GameObject在LoadLevel后不被卸载掉?
void Awake() { DontDestroyOnLoad(transform.gameObject); }
请简述GC(垃圾回收)产生的原因,并描述如何避免?
GC回收堆上的内存
避免:
1.减少new产生对象的次数
2.使用公用的对象(静态成员)
3.将String换为StringBuilder简述四元数的作用,四元数对欧拉角的优点?
四元数用于表示旋转
相对欧拉角的优点:
1.能进行增量旋转
2.避免万向锁
3.给定方位的表达方式有两种,互为负(欧拉角有无数种表达方式)移动相机动作在哪个函数里,为什么在这个函数里?
LateUpdate,是在所有的update结束后才调用,比较适合用于命令脚本的执行。官网上例子是摄像机的跟随,都是所有的update操作完才进行摄像机的跟进,不然就有可能出现摄像机已经推进了,但是视角里还未有角色的空帧出现。如何优化内存?
1.压缩自带类库;
2.将暂时不用的以后还需要使用的物体隐藏起来而不是直接Destroy掉;
3.释放AssetBundle占用的资源;
4.降低模型的片面数,降低模型的骨骼数量,降低贴图的大小;
5.使用光照贴图(LightMap),使用多层次细节(LOD),使用着色器(Shader),使用预设(Prefab)。动态加载资源的方式?他们之间的区别?
1.Resources.Load();直接加载
2.AssetBundle 需要解压请描述游戏动画有哪几种,以及其原理?
主要有关节动画、骨骼动画、单一网格模型动画(关键帧动画)。
1.关节动画:把角色分成若干独立部分,一个部分对应一个网格模型,部分的动画连接成一个整体的动画,角色比较灵活,Quake2中使用这种动画;
2.骨骼动画:广泛应用的动画方式,集成了以上两个方式的优点,骨骼按角色特点组成一定的层次结构,有关节相连,可做相对运动,皮肤作为单一网格蒙在骨骼之外,决定角色的外观;
3.单一网格模型动画:由一个完整的网格模型构成,在动画序列的关键帧里记录各个顶点的原位置及其改变量,然后插值运算实现动画效果,角色动画较真实。下列代码在运行中会发生什么问题?如何避免?
List ls = new List(new int[] { 1, 2, 3, 4, 5 });
foreach (int item in ls)
{
Console.WriteLine(item * item);
ls.Remove(item);
}
会产生运行时错误,因为foreach是只读的。不能一边遍历一边修改。
Unity3D是否支持写成多线程程序?如果支持的话需要注意什么?
支持:如果同时你要处理很多事情或者与Unity的对象互动小可以用线程,否则使用协程。
仅能从主线程中访问Unity3D的组件,对象和Unity3D系统调用。矩阵相乘的意义及注意点
用于表示线性变换:旋转、缩放、投影、平移、仿射
注意矩阵的蠕变:误差的积累为什么dynamic font(动态字体)在unicode环境下优于static font(静态字体)?
Unicode是国际组织制定的可以容纳世界上所有文字和符号的字符编码方案。使用动态字体时,Unity将不会预先生成一个与所有字体的字符纹理。当需要支持亚洲语言或者较大的字体的时候,若使用正常纹理,则字体的纹理将非常大。当一个细小的高速物体撞向另一个较大的物体时,会出现什么情况?如何避免?
会出现穿透。
解决方法:
1.增大细小物体的碰撞体
2.使用射线检测简述StringBuilder和String的区别?
1.String类型是个不可变的对象,当每次对String进行改变时都需要生成一个新的String对象,然后将指针指向一个新的对象,如果在一个循环里面,不断的改变一个对象,就要不断的生成新的对象,所以效率很低,建议在不断更改String对象的地方不要使用String类型。
2.StringBuilder对象在做字符串连接操作时是在原来的字符串上进行修改,改善了性能。这一点我们平时使用中也许都知道,连接操作频繁的时候,使用StringBuilder对象。Unity3D Shader分哪几种,有什么区别?
1.表面着色器的抽象层次比较高,它可以轻松地以简洁方式实现复杂着色。表面着色器可同时在前向渲染及延迟渲染模式下正常工作。
2.顶点/片元着色器可以非常灵活地实现需要的效果,但是需要编写更多的代码,并且很难与Unity的渲染管线完美集成。
3.固定函数着色器可以作为前两种着色器的备用选择,当硬件无法运行那些酷炫Shader的时,还可以通过固定功能管线着色器来绘制出一些基本的内容。C#中四种访问修饰符是哪些?各有什么区别?
1.属性修饰符:
Serializable:按值将对象封送到远程服务器。
STATread:是单线程套间的意思,是一种线程模型。
MATAThread:是多线程套间的意思,也是一种线程模型。
2.存取修饰符:
public:存取不受限制。
private:只有包含该成员的类可以存取。
internal:只有当前工程可以存取。
protected:只有包含该成员的类以及派生类可以存取。
3.类修饰符:
abstract:抽象类。指示一个类只能作为其它类的基类。
sealed:密封类。指示一个类不能被继承。理所当然,密封类不能同时又是抽象类,因为抽象总是希望被继承的。
4.成员修饰符:
abstract:指示该方法或属性没有实现。
sealed:密封方法。可以防止在派生类中对该方法的override(重载)。不是类的每个成员方法都可以作为密封方法密封方法,必须对基类的虚方法进行重载,提供具体的实现方法。所以,在方法的声明中,sealed修饰符总是和override修饰符同时使用。
delegate:委托。用来定义一个函数指针。C#中的事件驱动是基于delegate + event的。
const:指定该成员的值只读不允许修改。
event:声明一个事件。
extern:指示方法在外部实现。
override:重写。对由基类继承成员的新实现。
readonly:指示一个域只能在声明时以及相同类的内部被赋值。
static:指示一个成员属于类型本身,而不是属于特定的对象。即在定义后可不经实例化,就可使用。
virtual:指示一个方法或存取器的实现可以在继承类中被覆盖。
new:在派生类中隐藏指定的基类成员,从而实现重写的功能。 若要隐藏继承类的成员,请使用相同名称在派生类中声明该成员,并用 new 修饰符修饰它。Heap与Stack有何区别?
1.heap是堆,stack是栈。
2.stack的空间由操作系统自动分配和释放,heap的空间是手动申请和GC释放的,heap常用new关键字来分配。
3.stack空间有限,heap的空间是很大的自由区。协同程序的执行代码是什么?有何用处,有何缺点?
void Start()
{// 协同程序WaitAndPrint在Start函数内执行,可以视同于它与Start函数同步执行.
StartCoroutine(WaitAndPrint(2.0));
print (“Before WaitAndPrint Finishes ” + Time.time );
}
IEnumerator WaitAndPrint (float waitTime)
{// 暂停执行waitTime秒
yield return new WaitForSeconds (waitTime);
print (“WaitAndPrint “+ Time.time );
}
作用:一个协同程序在执行过程中,可以在任意位置使用yield语句。yield的返回值控制何时恢复协同程序向下执行。协同程序在对象自有帧执行过程中堪称优秀。协同程序在性能上没有更多的开销。
缺点:协同程序并非真线程,可能会发生堵塞。
什么是里氏代换原则?
子类对象可以赋值给基类对象,父类对象不能赋值给子类对象。客户端与服务器交互方式有几种?
1.Socket通常也称作”套接字”,实现服务器和客户端之间的物理连接,并进行数据传输,主要有UDP和TCP两个协议。Socket处于网络协议的传输层。
2.http协议传输的主要有http协议 和基于http协议的Soap协议(web service),常见的方式是 http 的post 和get 请求,web 服务。Unity3D在移动设备上的一些优化资源的方法
1.使用assetbundle,实现资源分离和共享,将内存控制到200m之内,同时也可以实现资源的在线更新
2.顶点数对渲染无论是cpu还是gpu都是压力最大的贡献者,降低顶点数到8万以下,fps稳定到了30帧左右
3.只使用一盏动态光,不是用阴影,不使用光照探头
粒子系统是cpu上的大头
4.剪裁粒子系统
5.合并同时出现的粒子系统
6.自己实现轻量级的粒子系统
animator也是一个效率奇差的地方
7.把不需要跟骨骼动画和动作过渡的地方全部使用animation,控制骨骼数量在30根以下
8.animator出视野不更新
9.删除无意义的animator
10.animator的初始化很耗时(粒子上能不能尽量不用animator)
11.除主角外都不要跟骨骼运动apply root motion
12.绝对禁止掉那些不带刚体带包围盒的物体(static collider )运动
NUGI的代码效率很差,基本上runtime的时候对cpu的贡献和render不相上下
13每帧递归的计算finalalpha改为只有初始化和变动时计算
14去掉法线计算
15不要每帧计算viewsize 和windowsize
16filldrawcall时构建顶点缓存使用array.copy
17.代码剪裁:使用strip level ,使用.net2.0 subset
18.尽量减少smooth group
19.给美术定一个严格的经过科学验证的美术标准,并在U3D里面配以相应的检查工具将Camera组件的ClearFlags选项选成Depth only是什么意思?有何用处?
如果把摄像机的ClearFlags勾选为Deapth Only,那么摄像机就会只渲染看得见的对象,把背景完全透明,这种情况一般用在两个摄像机以上的场景中。在编辑场景时将GameObject设置为Static有何作用?
设置游戏对象为Static时,这些部分被静态物体挡住而不可见时,将会剔除(或禁用)网格对象。因此,在你的场景中的所有不会动的物体都应该标记为Static。有A和B两组物体,有什么办法能够保证A组物体永远比B组物体先渲染?
把A组物体的渲染队列大于B物体的渲染队列,通过shader里面的渲染队列来渲染将图片的TextureType选项分别选为““Texture”和“Sprite”有什么区别?
Sprite作为UI精灵使用,Texture作用模型贴图使用。Sprite需要2的整次幂,打包图片省资源。问一个Terrain,分别贴3张,4张,5张地表贴图,渲染速度有什么区别?为什么?
没有区别,因为不管几张贴图只渲染一次。什么是DrawCall?DrawCall高了又什么影响?如何降低DrawCall?
Unity中,每次引擎准备数据并通知GPU的过程称为一次Draw Call。DrawCall越高对显卡的消耗就越大。降低DrawCall的方法:
Dynamic Batching(动态批)
Static Batching(静态批)
高级特性Shader降级为统一的低级特性的Shader。实时点光源的优缺点是什么?
可以有cookies -- 带有 alpha通道的立方图(Cubemap )纹理。点光源是最耗费资源的。简述水面倒影的渲染原理
原理就是对水面的贴图纹理进行扰动,以产生波光玲玲的效果。用shader可以通过GPU在像素级别作扰动,效果细腻,需要的顶点少,速度快。简述NGUI中Grid和Table的作用?
对Grid和Table下的子物体进行排序和定位。
63.反向旋转动画的方法是什么?
将原来播放动画的速度取反。
64.获取、增加、删除组件的命令分别是什么?
获取: GetComponent
增加: AddComponent
删除: Destroy //没有去掉组件的方法,只能直接删除物体
65、Animation.CrossFade命令作用是?
动画的淡入为其他动画
66、使用原生 GUI 创建一个可以拖动的窗口命令是什么?
GUI.DragWindow()
67、localPosition 与 Position 的使用区别?
localPosition :自身位置,相对于父级的变换的位置。
Position :在世界坐标transform 的位置。
68、写出 Animation 的五个方法。(可自行查看官方手册)
AddClip
CrossFade
Start
Stop
IsPlaying