U3D面试题四
Posted allyh
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了U3D面试题四相关的知识,希望对你有一定的参考价值。
1.配置Unity3D调试环境
在windows环境下,设置unity3d的编辑器调试环境方法:
点击“Edit‘---”Preferences“,弹出如下窗口
选择MonoDeveop即可。
在编辑器中打开调试开关方法:
在编辑器中点击”Tools“----”Options“,弹出如下窗口
选择”Unity.exe“文件即可。
二、Array(数组)和List<T>的异同点
1、数组的容量固定,而ArrayList或List<T>的容量可根据需要自动扩充。
2、数组可有多个维度,而 ArrayList或 List< T> 始终只有一个维度。(可以创建数组列表或列表的列表)
3、特定类型的数组性能优于 ArrayList的性能(不包括Object,因为 ArrayList的元素是 Object ,在存储或检索值类型时通常发生装箱和取消装箱操作)。
4、 ArrayList 和 List<T>基本等效,如果List< T> 类的类型T是引用类型,则两个类的行为是完全相同的。如果T是值类型,需要考虑装箱和拆箱造成的性能损耗。List<T> 是类型安
三、unity3d常用组件
(1)Transform,基础组建,每一个游戏对象都有
(2)Box Collider
(3)、Mesh:网格组件。
(4)、Effects:效果组件。
(5)、Physics:物理组件。
(6)、Physics 2D:2D物理组件。
(7)、Navigation:导航组件。
(8)、Audio:音频组件。
(9)、Rendering:渲染组件。
(10)、Layout:布局组件。
(11)、Event:事件组件。
(12)、UI:UI元素组件。
(13)、Scripts:已创建的脚本组件。
(14)、New Script:新建一个脚本组件。
四、unity3D中的游戏对象有哪些属性?
position/rotation/Scale
五、实现UI的技术
GUI/UGUI/NGUI
六、NGUI动画是怎么实现的?
Tween动画,和Animation动画。
七、什么是渲染管线
答: 渲染简单的理解可能可以是这样:就是将三维物体或三维场景的描述转化为一幅二维图像,生成的二维图像能很好的反应三维物体或三维场景。 渲染管线也称为渲染流水线,是显示芯片内部处理图形信号相互独立的的并行处理单元。一个流水线是一序列可以并行和按照固定顺序进行的阶段。每个阶段都从它的前一阶段接收输入,然后把输出发给随后的阶段。就像一个在同一时间内,不同阶段不同的汽车一起制造的装配线,传统的图形硬件流水线以流水的方式处理大量的顶点、几何图元和片段。
(1) 顶点变换是图形硬件渲染管线种的第一个处理阶段;
(2) 二.图元装配(Primitive Assembly)和光栅化(Rasterization);
(3) 三.插值、贴图和着色;
(4) 四.光栅操作(Raster Operations);
(5) 五.形象化图形流水线;
八.Unity中如何播放视频
答: Unity3D中播放游戏视频的方式有两种,第一种是在游戏对象中播放,就好比在游戏世界中创建一个Plane面对象,摄像机直直的照射在这个面上。第二种是在GUI层面上播放视频。播放视频其实和贴图非常相像,因为播放视频用到的MovieTexture属于贴图Texture的子类;
Unity支持的播放视频格式有.mov、.mpg、.mpeg、.mp4、.avi和.asf。只需将对应的视频文件拖拽入Project视图即可,它会自动生成对应的MovieTexture对象。如下图所示,MOMO将default_video.mp4拖拽入Project视图中,如果视频中含有音频的话会对应生成audio文件,因为我的视频没有音频所以没有生成 audio文件。接着在Hierarchy视图中创建一个Plane对象视频将在它之上播放,Directional light世界定向光用于照亮整个游戏场景,最后Main Camera对象将直直的照射在Plane对象。
13. C#中什么是重写?
是指在子类中对父类的某方法进行重新定义,其子类的该方法名以及参数位置和个数均与父类相同,从而在调用子类的该方法时,不会执行父类的方法。
重写只在继承中,子类通过override关键字修饰方法,实现父类和子类相同方法的不同实现,注意,父类方法必须是用virtual或者abstract关键字修饰的虚方法或者抽象方法
14.C#中什么是重载?
具有相同的方法名,只要其使用的参数个数或是参数类型不同 :参数类型不同,参数数量不同,参数类型、数量相同但顺序不同
15.函数原型和函数签名有什么区别?
函数声明由函数返回类型、函数名和形参列表组成。形参列表必须包括形参类 型,但是不必对形参命名。这三个元素被称为函数原型,函数原型描述了函数的接口。一个函数由这么几部分组成,函数名、参数个数、参数类型、返回值,就是把 函数名字去掉以后剩下的东西(返回值、参数、调用方式等)。函数在重载时 ,利用函数签名的不同(即参数个数与类型的不同)来区别调用者到底调用的 是那个方法。
16. 图像中的RGBA指的是什么?
R:red(红) G:green(绿) B:blue(蓝) A:透明度(取值范围: 0到1)
17.游戏中常用的寻路算法有哪些?
寻路可以有多种算法:
1) DFS
2) BFS
3) Dijkstra
4) A*路点寻路
5) D*
6) NAV导航网格寻路
7) 预设导航点的固定路径
在以上前四种中,A*是平均计算速度最优的;Dijistra算法相当于A*算法中估价值为0的情况。后面几种,D*是用于动态路径的算法(用于机器人探路,比如火星探测器的寻路; NAV导航网格寻路其实也是基于A*实现,目前主要应用在3D游戏中。
18.类之间的关系
继承关系:一个类继承另外一个类
实现关系: 实现指的是一个class类实现interface接口(可以是多个)的功能,实现是类与接口
之间最常见的关系
依赖关系:简单的理解,依赖就是一个类A使用到了另一个类B,而这种
使关系是具有偶然性的、临时性的、非常弱的,但是类B的变化会影
响到类A
关联关系:关联体现的是两个类之间语义级别的一种强依赖关系,比如我和
我的朋友,这种关系比依赖更强、不存在依赖关系的偶然性、关
系也不是临时性的,一般是长期性的,而且双方的关系一般是平
的。关联可以是单向、双向的。表现在代码层面,为被关联类B
以类的属性形式出现在关联类A中,也可能是关联类A引用了一
个类型为被关联类B的全局变量。
聚合关系:聚合是关联关系的一种特例,它体现的是整体与部分的关系,即
has-a的关系。此时整体与部分之间是可分离的,它们可以具有
各自的生命周期,部分可以属于多个整体对象,也可以为多个整
体对象共享。
组合关系:组合也是关联关系的一种特例,它体现的是一种contains-a的
关系,这种关系比聚合更强,也称为强聚合。它同样体现整体与
部分间的关系,但此时整体与部分是不可分的,整体的生命周
期结束也就意味着部分的生命周期结束,比如人和人的大脑。表
现在代码层面,和关联关系是一致的,只能从语义级别来区分。
总结: 组合也是关联关系的一种特例,它体现的是一种contains-a的关
系,这种关系比聚合更强,也称为强聚合。它同样体现整体与部分
间的关系,但此时整体与部分是不可分的,整体的生命周期结束也
就意味着部分的生命周期结束,比如人和人的大脑。表现在代码层
面,和关联关系是一致的,只能从语义级别来区分。在UML类图设
计中,组合关系以实心菱形加实线箭头表示。
19.Unity3D中如何判断两个物体发生碰撞?
碰撞体可以用来检测某个对象是否碰到另外一个对象,所以可以通过在两物体上添加碰撞体组件,其中至少有一个添加刚体的方法,来进行判断
20.Unity3D中如何判断两个物体发生触发事件?
答:在一个物体上加个触发器,调试范围,当另一物体碰到就触发。或者在updata里判断:在一个物体身上加一个trigger,trigger大小就是触发范围,当另一物体碰到就触发。
21.游戏中的摄像机的作用是什么?什么情况下需要多个摄像机?
答:通过摄像机,可以将游戏场景中的画面、物体等显示在玩家的屏幕上,玩家也是通过摄像机来观看游戏世界,继而操作游戏人物或者物体。
需要多个摄像机:比如UI和特效、UI和场景角色。
22.Unity3D中哪些用了烘焙技术?
光影,场景,模型
23.什么叫漫反射贴图,法向贴图,高光贴图,凹凸贴图,环境贴图?
漫反射:物体的固有色以及纹理,贴图上的光影;
法向:法线??
高光:表现当光线照射到模型表面时,其表面属性的.(如金属和皮肤、布、塑料反射不同量的光)从而区分不同材质.
高光贴图再引擎中表现镜面反射和物体表面的高光颜色。
凹凸:给贴图增加立体感,通过影响模型表面的影子来达到凸凹效果
法线(改变我们所看到的表面的倾斜度)与高度(实际上就是一个2D数组);
环境:简称AO贴图,AO贴图的计算是不受任何光线影响的,仅仅计算物体间的距离,并根据距离产生一个8位的通道。
24.OpenGL和DirectX是什么?
opengl是图形库,DirectX是多媒体库;
25.Unity3D中制作关卡地形的技术有哪些?
Terrain
Width : 地形的宽度
Terrain Height : 地形的高度
Terrain Length : 地形的长度
HeightMap Resolution:地形高度图片所使用的分辨率.
26.Unity3D中动画系统有几种?各自特点都是什么?如何配置一个模型的行走动画?
有两种 Unity有两套Animation系统,一套是legacy,一套是Mecanim。
Debug模式下的Animation Type 0表示Mecanim,可以用于animator;
1表示Legacy,用于animation组件
27 . Unity3D中可以用多种语言来写,都有什么语言?
可以使用c#编写游戏,同时可以使用js,u3d同样可以加入插件使用lua语言进行开发,各有各的好处看自己的意愿
28.什么是游戏逻辑?游戏表现?游戏逻辑包括哪些内容?游戏表现包括哪些内容?
游戏逻辑一般就是游戏的算法,打个比方就是你制作一个斯洛克台球游戏,这个斯洛克台球的游戏规则就是游戏逻辑 (第一问 剩下了搜不到也不会)
29. Unity3D中协程什么?
通俗点讲就是,协程是一种可以分部执行的函数,即该函数不是每次调用时都会执行函数体内的全部方法,而是只调用其中部分代码。
30.设计模式是什么?
设计模式是一种流行的思考设计问题的方法,是一套被反复使用,多数人知晓的,经过分类编目的,代码设计经验的总结。
使用了设计模式,是为了使代码具有可重用性,让代码更容易被他人理解和保证代码的可靠性
31,冒泡排序法原理:
依次比较相邻的两个数,将小数放在前面,大数放在后面,直至比较最后两个数,重复以上过程,如此下去,直至最终完成排序。
32.游戏优化的方向有哪些
(1)CPU
引发的问题:由于短时间内的计算量太大,导致画面流畅性降低,俗称跳帧;发热严重,耗电量高
常见的优化手段:将计算分到多个逻辑帧中进行计算,避免短时间内的性能超过负荷,俗称“分帧”(time-slice)。
将可以缓存的数据尽可能的缓存起来,避免重复计算和重复分配内存,常见的示例为“内存池”。
使用合理的算法和数据结构,比如:冒泡排序和直接插入排序在整体数组比较有序的情况下效率大大好于快速排序。把快排替换成是优化程序排序效率的一个常见的思路。
(2)GPU
引发的问题:发热严重,耗电量高 FPS降低
常见的优化手段:优化美术资源,比如合理规划图集,约定好模型的最大三角形面数,制定合理的粒子效果规范。这个可以说是游戏优化中最重要的一个,因此,技术美术在游戏开发中作用巨大。
简化或者优化着色器(shader)
使用Batching,尽量减少DrawCall
使用平台推荐的压缩格式,比如安卓平台的ETC1和ios平台的 PVRTC
(3)IO和网络
引发的问题:网络延迟甚至掉线
加载资源导致的跳帧
加载时间过长
常见的优化手段:使用独立的线程进行加载,有些引擎如Unity中还能利用协程
减少网络包里面的冗余数据
合并小包,减少请求数据的次数
分帧对回包进行处理
限制一定时间内的发包频率
(4)内存
引发的问题:闪退和卡死,比如安卓的Low Memory Killer会在低内存情况下杀掉内存占用过大的程序。
常见的优化手段:动态加载和卸载资源,比如在游戏内的时候,我们可以把游戏外的一些UI图集卸载掉。
降低资源质量或屏幕分辨率,这是有损优化,一般作为最后的手段。
33.Unity3D如何对游戏进行优化
(1)减少内存的使用(2)尽量减少Unity回调函数(3)减少角色控制器移动命令的调用:动态加载和卸载资源,
34.碰撞器和触发器的区别?
碰撞器:一群组件,它包含了很多种类,比如:Box Collider(盒碰撞体),Mesh Collider(网格碰撞体)等,这些碰撞器应用的场合不同,但都必须加到GameObjecet身上。
触发器,只需要在检视面板中的碰撞器组件中勾选IsTrigger属性选择框。
unity3d中的碰撞器和触发器的区别?
碰撞器是触发器的载体,而触发器只是碰撞器身上的一个属性
当Is Trigger=false时,碰撞器根据物理引擎引发碰撞,产生碰撞的效果,可以调用OnCollisionEnter/Stay/Exit函数;
当Is Trigger=true时,碰撞器被物理引擎所忽略,没有碰撞效果,可以调用OnTriggerEnter/Stay/Exit函数。
如果既要检测到物体的接触又不想让碰撞检测影响物体移动或要检测一个物件是否经过空间中的某个区域这时就可以用到触发器
例子:
碰撞器:汽车被撞飞、皮球掉在地上又弹起效果
触发器:人站在靠近门的位置门自动打开效果
35.物体发生碰撞的必要条件
要产生碰撞必须为游戏对象添加刚体(Rigidbody)和碰撞器,刚体可以让物体在物理影响下运动。碰撞体是物理组件的一类,它要与刚体一起添加到游戏对象上才能触发碰撞。如果两个刚体相互撞在一起,除非两个对象有碰撞体时物理引擎才会计算碰撞,在物理模拟中,没有碰撞体的刚体会彼此相互穿过。
36. CharacterController和Rigidbody的区别?
Rigidbody是用来模拟真实物理效果的,它可以设置重力,可以为对象施加外力。注意它和各种Collider的关系:只有Rigidbody才能被施加外力,这个力可能是被直接施加的,也可能是被其它Rigidbody碰撞产生的间接力;而Collider是用来设置碰撞的一些参数。简单说:没有Rigidbody就不会动,没有Collider就不能碰撞或被碰撞。这个用于赛车类需要真实物理效果的游戏比较合适。
CharacterController除了重力效果之外,它是不能受物理力的。本身自带了一个胶囊碰撞体,可以用来产生碰撞。只有调用Move或SimpleMove,对象才能移动。所以它被称为角色控制器,一般的角色操作类游戏用这个比较合适。
NavMeshAgent属于寻路系统,它也带有一个圆柱体形的碰撞体。如果两个这样的对象相遇,就会产生推动效果。寻路过程的计算细节并不清楚,但根据测试,应该也是用物理系统去模拟了一些计算(之所以会和物理系统产生冲突,可能就是因为这个原因)。
37.物体发生碰撞时,有几个阶段,分别对应的函数;
3个阶段: OnCollisionEnter/OnCollisionStay/OnCollisionExit;
38.物体发生碰撞时,几种施加压力的方式,描述出来;
rigidbody.AddForce
rigidbody.AddForceAtPosion
都是rigidbody的成员函数
39.Unity3D中提供了几种光源,分别是什么?写出他们的应用范围。
直线光源(Directional)、点光源(Point)、射线光源(Spot)、区域光(Area)(只用于烘焙);
40.物理更新一般在哪个系统函数里?
物理更新一般在FixedUpdate,
没固定帧绘制时执行一次,
和update不同的是FixedUpdate是渲染帧执行,
如果你的渲染效率低下的时候,FixedUpdate调用次数就会跟着下降。
FixedUpdate比较适合用于物理引擎的计算,
因为是跟每帧渲染有关。
Update就比较适合做控制。
41.移动相机动作在哪个函数里,为什么要在这个函数里?
LateUpdate,在每帧执行完毕调用,
它是在所有Update结束后才调,比较适合用于命令脚本的执行。
官网上例子是摄像机的跟随,都是在所有Update操作完才跟进摄像机,
不然就有可能出现摄像机已经推进了,但是视角里还未有角色的空帧出现。
42.简述一下Prefab的用处;
Prefab在实例化的时候用到,主要用于经常会用到的物体,属性方便修改。
43.简述一下对象池,你觉得在FPS游戏里哪些东西适合使用对象池;
对象池:将一些需要多次重复使用、经常生成和销毁的同类对象放到一个池子中,形成对象池(Object Pool);在使用的时候直接从对象池中获取,不使用时放回到对象池中。适用于创建、销毁开销很大,或者需要频繁生成、销毁的一类对象。
FPS游戏中,一些小怪、补给资源包、枪械武器可以适用于对象池。但对象池内容过多会占用更多内存,所以在是否使用对象池上还需要平衡考虑。
44.请通过一个简易的示意图来描述游戏脚本组件的生命周期;
Reset→Awake→OnEnable→Start→FixedUpdate→OnTrigerEnter/Stay/Exit→OnCollisionEnter/Stay/Exit→OnMouseDown/Up→Update→LateUpdate→OnGUI→OnDisable→Ondestroty
45.什么是协同程序?
协同程序,即在主程序运行时同时开启另一段逻辑处理,来协同当前程序的执行。换句话说,开启协同程序就是开启一个线程。
46.C#中命名空间如何写,作用是什么?
答:用namespace关键字声明命名空间,里面包括类,接口,委托,事件,枚举,结构。
作用:利用命名空间组织把C#里面的类组织起来,(1)提供了一种组织类的方法,便于管理(2)防止命名冲突。
怎么用:可以通过using关键字将一个命名空间所包含的类型导入到编译单元或者命名空间提中
47.C#中静态和非静态成员变量的区别是什么;
1.内存分配
静态变量在应用程序初始化时,就存在于内存当中,直到它所在的类的程序运行结束时才消亡;
而非静态变量需要被实例化后才会分配内存。
2.生存周期
静态变量生存周期为应用程序的存在周期;
非静态变量的存在周期取决于实例化的类的存在周期。
3.调用方式
静态变量只能通过“类.静态变量名”调用,类的实例不能调用;
非静态变量当该变量所在的类被实例化后,可通过实例化的类名直接访问。
4.共享方式
静态变量是全局变量,被所有类的实例对象共享,即一个实例的改变了静态变量的值,其他同类的实例读到的就是变化后的值;
非静态变量是局部变量,不共享的。
5.访问方式
静态成员不能访问非静态成员;
非静态成员可以访问静态成员。
48.C#中delegate是什么?作用是什么?如何在C#中做闭包?
答:delegate是委托关键字
Public delegate void method(string name);//method相当于int在类里面用的时候,必须先定义一个出来
Public method me;//me可以在加等于方法名把方法放进委托里面,就可以实现方法像变量一样传递(可以作为参数)
namespace add
{
class closebag
{
static void Main(string[] args)
{
var a=new closebag();
var b = a.T1();
Console.Write(b());
}
public Func<int> T1()
{
var n = 999;
return () =>
{
Console.Write(n);
return n;
};
}
}
}
三种变量 (1)全局变量 (2)局部变量 (3)方法内的代码片段里面的变量
第三种变量如果在另一环境中有调用的时候第三种变量所在的方法执行完不会被释放内存实现闭包
闭包定义:闭包是指可以包含自由(未绑定到特定对象)变量的代码块
49.C#中什么是重载;
答:在同一类中有多个相同名字的方法,通过方法的参数个数,类型,顺序不同,返回类型不同来区分调用就是重载
以上是关于U3D面试题四的主要内容,如果未能解决你的问题,请参考以下文章
经过阿里四面而形成的10万字java面试题及答案文档到底有多牛?
四面Alibaba,成功入职,定级P7,展示21年最新阿里面试题