您的位置:首页 > 移动开发 > Unity3D

Unity3D面试和笔试题

2016-09-15 18:38 176 查看
Unity3D常见面试和笔试题总结

问答题

Unity3D中函数执行顺序

Awake()->OnEnable()->Start->FixedUpdate()->OnTriggerXXXX()->OnCollisionXXXX()->OnMouseXXXX()->Update()->LateUpadte()->OnBecameVisiable()->OnBecameInvisiable()->XXXXRenderXXXX()->OnGUI()->OnDisable()->OnDestroy()

详情

什么是渲染管道

是指在显示器上为了显示出图像而经过的一系列必要操作。

渲染管道中的很多步骤,都要将几何物体从一个坐标系中变换到另一个坐标系中去。

主要步骤有:

本地坐标->视图坐标->背面裁剪->光照->裁剪->投影->视图变换->光栅化。

参考

如何优化内存?

A、压缩自带类库;

B、将暂时不用的以后还需要使用的物体隐藏起来而不是直接Destroy掉;

C、释放AssetBundle占用的资源;AssetBundle资源包

D、降低模型的片面数,降低模型的骨骼数量,降低贴图的大小;

E、使用光照贴图,使用多层次细节(LOD),使用着色器(Shader),使用预设(Prefab)。

拓展阅读

动态加载资源的方式

(1).通过Resources模块,调用它的load函数:可以直接load并返回某个类型的Object,前提是要把这个资源放在Resource命名的文件夹下,Unity不管有没有场景引用,都会将其全部打入到安装包中。Resources.Load();

(2).通过bundle的形式:即将资源打成 asset bundle 放在服务器或本地磁盘,然后使用WWW模块get 下来,然后从这个bundle中load某个object。AssetBundle

(3).通过AssetDatabase.loadasset :这种方式只在editor范围内有效,游戏运行时没有这个函数,它通常是在开发中调试用的【AssetDatabase 资源数据库】

**区别:**Resources的方式需要把所有资源全部打入安装包,这对游戏的分包发布(微端)和版本升级(patch)是不利的,所以unity推荐的方式是不用它,都用bundle的方式替代,把资源打成几个小的bundle,用哪个就load哪个,这样还能分包发布和patch,但是在开发过程中,不可能每更新一个资源就打一次bundle,所以editor环境下可以使用AssetDatabase来模拟,这通常需要我们封装一个dynamic resource的loader模块,在不同的环境下做不同实现。

动态资源的存放

有时需要存放一些自己的文件在磁盘上,例如想把几个bundle放在初始的安装里, unity有一个streaming asset的概念,用于提供存储接口的访问。我们需要在编辑器建立一个StreamingAssets名字的文件夹,把需要我们放在客户磁盘上的动态文件放在这个文件夹下面,这样安装后,这些文件会放在用户磁盘的指定位置,这个位置可以通过Application.streamingAssetsPath来得到。

什么是协同程序?

在主线程运行时同时开启另一段逻辑处理,来协助当前程序的执行。换句话说,开启协程就是开启一个线程。可以用来控制运动、序列以及对象的行为。

Unity3d中的碰撞器和触发器的区别

要产生碰撞必须为游戏对象添加刚体(Rigidbody)和碰撞器,刚体可以让物体在物理影响下运动。碰撞体是物理组件的一类,它要与刚体一起添加到游戏对象上才能触发碰撞。如果两个刚体相互撞在一起,除非两个对象有碰撞体时物理引擎才会计算碰撞,在物理模拟中,没有碰撞体的刚体会彼此相互穿过。

物体发生碰撞的必要条件

两个物体都必须带有碰撞器(Collider),其中一个物体还必须带有Rigidbody刚体。

在unity3d中,能检测碰撞发生的方式有两种,一种是利用碰撞器,另一种则是利用触发器。

碰撞器:一群组件,它包含了很多种类,比如:Box Collider(盒碰撞体),Mesh Collider(网格碰撞体)等,这些碰撞器应用的场合不同,但都必须加到GameObjecet身上。

触发器,只需要在检视面板中的碰撞器组件中勾选IsTrigger属性选择框。

触发信息检测:

1.MonoBehaviour.OnTriggerEnter(Collider collider)当进入触发器

2.MonoBehaviour.OnTriggerExit(Collider collider)当退出触发器

3.MonoBehaviour.OnTriggerStay(Collider collider)当逗留触发器

碰撞信息检测:

1.MonoBehaviour.OnCollisionEnter(Collision collision) 当进入碰撞器

2.MonoBehaviour.OnCollisionExit(Collision collision) 当退出碰撞器

3.MonoBehaviour.OnCollisionStay(Collision collision) 当逗留碰撞器

碰撞器是触发器的载体,而触发器只是碰撞器身上的一个属性。

当Is Trigger=false时,碰撞器根据物理引擎引发碰撞,产生碰撞的效果,可以调用OnCollisionEnter/Stay/Exit函数;

当Is Trigger=true时,碰撞器被物理引擎所忽略,没有碰撞效果,可以调用OnTriggerEnter/Stay/Exit函数。

如果既要检测到物体的接触又不想让碰撞检测影响物体移动或要检测一个物件是否经过空间中的某个区域这时就可以用到触发器

点击查看原文

Unity3d提供了一个用于保存和读取数据的类(PlayerPrefs),请列出保存和读取整形数据的函数

//保存数据
PlayerPrefs.SetString("Name",mName);
PlayerPrefs.SetInt("Age",mAge);
PlayerPrefs.SetFloat("Grade",mGrade)


//读取数据
mName=PlayerPrefs.GetString("Name","DefaultValue");
mAge=PlayerPrefs.GetInt("Age",0);
mGrade=PlayerPrefs.GetFloat("Grade",0F);


点击查看详情

Unity3d提供了几种光源类型

Unity中提供四种光源:PointLight、DirectLight、SpotLight、AreaLight。

Directional light: 方向光,类似太阳的日照效果。

Point light: 点光源,类似蜡烛。

Spotlight: 聚光灯,类似手电筒。

Area Light:区域光,无法用作实时光照,一般用于光照贴图烘培。

Unity中Light的面板如下:



Type:可以选择以上介绍的四种光源类型

Range:设置光源范围的大小,从光源对象的中心发射的距离。只有Point和Spotlight有该参数。

Color:光源的颜色

Instensity:光源的强度

Cookie:用于为光源设置拥有alpha通道的纹理,时光线在不同地方有不同的亮度,如果是聚光灯(Spotlight)和方向光(DirectionalLight),可以指定一个2D纹理。如果是一个点光源(Point light),必须指定一个Cubemap(立方体纹理)。

Cookie Size:用于控制缩放Cookie投影,只有方向光(DirectionalLight)有该参数。

Shadow Type:阴影类型

No Shadows 关闭阴影

Hard Shadows 硬阴影

Soft Shadows 软阴影

个人理解:与现实世界对比,硬阴影就好比太阳光特别的强烈,照出来的影子有棱有角;软阴影就好比阴天的时候,但是有那么一丝丝阳光,影子相比没那么明显,阴影比较平滑,需要注意的是软阴影会消耗系统更多的资源。

注意:默认设置下,只有Directional light光源才可以开启阴影,Pointlight、Spotlight光源开启阴影的话会弹出提示(Only directionallight have shadows in forward redering),意思就是说只有Directionallight光源在Forward模式下才可以开启阴影(只有发布成web版或单机版才支持)

Strength:强度,就是晴天跟阴天的效果吧

Resolution:控制阴影分辨率的质量

Bias:设置灯光控件的像素位置与阴影贴图值比较的偏移量,取值范围0~0.5,当值过小,对象表面会产生self- shadow,就是物体的表面会有来自于自身阴影的错误显示;当值过大,阴影就会较大程度的偏离投影的对象。

Softness:控制阴影模糊采样去的偏移量,只有方向光设置为软阴影的情况才会启用。

Softness Fade:控制阴影模糊采样区的偏移量,有有方向光设置为软投影的情况下才会启用。

Draw Halo:勾选此项,光源会开启光晕效果。

Flare:耀斑/炫光,镜头光晕效果。

RenderModel 渲染模式

Auto:自动,根据光源的亮度以及运行时Quality sSetting的设置来确定光源的渲染模式。

Important:重要,逐像素进行渲染,一般用于非常重要的光源渲染

Not Important:光源总是以最快的速度进行渲染。

Culling Mask :剔除遮蔽图,选中层所关联的对象将收到光源照射的影响。

Lightmapping:光照贴图,用于控制光源对光照贴图的影响模式

RealtimeOnly:实时灯光计算,不参与光照贴图的烘培计算。

Auto:自动

BakedOnly:用于光照贴图的烘培,不进行实时灯光计算。

移动摄像机的动作放在哪个系统函数中,为什么?

LateUpdate,在每帧执行完毕调用,它是在所有Update结束后才调,比较适合用于命令脚本的执行。官网上例子是摄像机的跟随,都是在所有Update操作完才跟进摄像机,不然就有可能出现摄像机已经推进了,但是视角里还未有角色的空帧出现。

请描述Prefab的作用,并描述如何在移动设备的环境下恰当的使用它?

Prefab在实例化的时候用到,主要用于经常会用到的物体,属性方便修改,同时节省内存。

请描述游戏动画有哪几种,以及其原理?

主要有关节动画、骨骼动画、单一网格模型动画(关键帧动画)。

a.关节动画:把角色分成若干独立部分,一个部分对应一个网格模型,部分的动画连接成一 个整体的动画,角色比较灵活,Quake2中使用这种动画;

b.骨骼动画,广泛应用的动画方式,集成了以上两个方式的优点,骨骼按角色特点组成一定的层次结构,有关节相连,可做相对运动,皮肤作为单一网格蒙在骨骼之外,决定角色的外观;

c.单一网格模型动画由一个完整的网格模型构成,在动画序列的关键帧里记录各个顶点的原位置及其改变量,然后插值运算实现动画效果,角色动画较真实。

alpha blend工作原理

待更新

写出光照计算中的diffuse的计算公式

计算公式为: Idiffuse = Dintensity*Dcolor*N.L ; (Dintensity表示漫反射强度, Dcolor 表示漫反射光颜色, N 为该点的法向量, L 为光源向量 其中N与L点乘,如果结果小于等于0,则漫反射为0。)

Lod是什么,优缺点是什么?

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

两种阴影判断的方法、工作原理

A.阴影由两部分组成:本影与半影

a.本影:景物表面上那些没有被光源直接照射的区域(全黑的轮廓分明的区域)

b.半影:景物表面上那些被某些特定光源直接照射但并非被所有特定光源直接照射的区域(半明半暗区域)

求阴影区域的方法:做两次消隐过程

一次对每个光源进行消隐,求出对于光源而言不可见的区域L;

一次对视点的位置进行消隐,求出对于视点而言可见的面S;

shadow area= L ∩ S

B.阴影分为两种:自身阴影和投射阴影

自身阴影:因物体自身的遮挡而使光线照射不到它上面的某些可见面

工作原理:利用背面剔除的方法求出,即假设视点在点光源的位置。

投射阴影:因不透明物体遮挡光线使得场景中位于该物体后面的物体或区域受不到光照照射而形成的阴影

工作原理:从光源处向物体的所有可见面投射光线,将这些面投影到场景中得到投影面,再将这些投影面与场景中的其他平面求交得出阴影多边形,保存这些阴影多边形信息,然后再按视点位置对场景进行相应处理得到所要求的视图(利用空间换时间,每次只需依据视点位置进行一次阴影计算即可,省去了一次消隐过程)

若是动态光源此方法就无效了。

Vertex Shader是什么,怎么计算?

顶点着色器

顶点着色器是一段执行在GPU上的程序,用来取代fixed pipeline中的transformation和lighting,Vertex Shader主要操作顶点。

Vertex Shader对输入顶点完成了从local space到homogeneous space(齐次空间)的变换过程,homogeneous space即projection space的下一个space。在这其间共有world transformation, view transformation和projection transformation及lighting几个过程。

待补充

MipMap是什么,作用?

MipMapping:在三维计算机图形的贴图渲染中有常用的技术,为加快渲染进度和减少图像锯齿,贴图被处理成由一系列被预先计算和优化过的图片组成的文件,这样的贴图被称为MipMap。

写出Animation的五个方法

AddClip 添加剪辑、Blend 混合、Play 播放、Stop 停止、Sample 采样

请简述向量的点乘,向量的叉乘以及向量归一化的几何意义?

点乘的几何意义是:计算两个向量之间的夹角,以及在某一方向上的投影;

叉乘的几何意义是:创建垂直于平面,三角形,或者多边形的向量;

Unity3D中的协程(Coroutine)和C#线程之间的区别是什么?

Unity3d没有多线程的概念,不过unity也给我们提供了StartCoroutine(协同程序)和LoadLevelAsync(异步加载关卡)后台加载场景的方法。 StartCoroutine为什么叫协同程序呢,所谓协同,就是当你在StartCoroutine的函数体里处理一段代码时,利用yield语句等待执行结果,这期间不影响主程序的继续执行,可以协同工作。而LoadLevelAsync则允许你在后台加载新资源和场景,所以再利用协同,你就可以前台用loading条或动画提示玩家游戏未卡死,同时后台协同处理加载的事宜。

请简述四元数的作用以及四元数相对于欧拉角的优点

A.四元数一般定义如下:q=w+xi+yj+zk其中 w,x,y,z是实数。同时,有: i*i=-1 j*j=-1 k*k=-1

B.四元数也可以表示为: q=[w,v]

有多种方式可表示旋转,如 axis/angle、欧拉角(Euler angles)、矩阵(matrix)、四元组等。 相对于其它方法,四元组有其本身的优点:

a.四元数不会有欧拉角存在的 gimbal lock 问题[万向节死锁]

b.四元数由4个数组成,旋转矩阵需要9个数

c.两个四元数之间更容易插值

d.四元数、矩阵在多次运算后会积攒误差,需要分别对其做规范化(normalize)和正交化 (orthogonalize),对四元数规范化更容易

e.与旋转矩阵类似,两个四元组相乘可表示两次旋转

请说出4种面向对象的设计原则,并分别简述它们的含义。

1) 单一职责原则 (The Single Responsiblity Principle,简称SRP):一个类,最好只做一件事,只有一个引起它的变化.

2) 开放-封闭原则 (The Open-Close Principle,简称OCP):对于扩展是开放的,对于更改是封闭的

3) Liskov 替换原则(The Liskov Substitution Principle,简称LSP):子类必须能够替换其基类

4) 依赖倒置原则(The Dependency Inversion Pricinple,简称DIP):依赖于抽象

5) 接口隔离原则 (The Interface Segregation Principle,简称ISP):使用多个小的专门的接口,而不要使用一个大的总接口。

Material和Physic Material区别?

PhysicMaterial 物理材质:物理材质描述,如何处理物体碰撞(摩擦,弹性)。

Material材质(材质类)为了获得一个对象使用的材质,可以使用 Renderer.materia属性

法线贴图 、CG动画

A.法线贴图:是在原物体的凹凸表面的每个点上均作法线,通过RGB颜色通道来标记法线的方向,你可以把它理解成与原凹凸表面平行的另一个不同的表面,但实际上它又只是一个光滑的平面。

B.CG动画:原为Computer Graphics的英文缩写。随着以计算机为主要工具进行视觉设计和生产的一系列相关产业的形成,国际上习惯将利用计算机技术进行视觉设计和生产的领域通称为CG。它既包括技术也包括艺术,几乎囊括了当今电脑时代中所有的视觉艺术创作活动,如平面印刷品的设计、网页设计、三维动画、影视特效、多媒体技术、以计算机辅助设计为主的建筑设计及工业造型设计等。

本文转载自http://unity3d.lofter.com/post/9dd8e_567ca6c
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  unity3d 面试