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

unity常见面试题

2015-08-16 01:47 267 查看
unity常见面试题

1. 游戏对象

问题:游戏对象消失三种方法的区别?(enabled/Destroy/active)

gameObject.renderer.enabled=fasle

是控制一个物体是否在屏幕上渲染或显示 而物体实际还是存在的 只是想当于隐身 而物体本身的碰撞体还依然存在的

GameObject.Destroy()

表示移除物体或物体上的组件 代表销毁该物体 实际上该物体的内存并没有立即释放 而是在你下下个场景中槽释放内存资源,就是你a场景中Destroy了 一般是在c场景中才真正释放该物体的内存资源(这是我的体会 不知道理解错误没)

gameObject.active=false

是否在场景中停用该物体 在你gameObject.active =false中 则你在场景中用find找不到该物体

如果该物体有子物体 你要用SetActiveRecursively(false) 来控制是否在场景中停用该物体(递归的)

副作用:通过GameObject.Find方法查找不到

2. 协同程序(Coroutine)

协同程序,即在主程序运行时同时开启另一段逻辑处理,来协同当前程序的执行。换句话说,开启协同程序就是开启一个线程。

原理:协同程序被开启后作为一个线程在运行,而MonoBehaviour也是一个线程,他们成为互不干扰的模块,除非代码中用调用,他们共同作用于同一个对象,只有当对象不可见才能同时终止这两个线程。

使用MonoBehaviour.StartCoroutine方法即可开启一个协同程序。

使用StopCoroutine(string methodName)来终止一个协同程序,使用StopAllCoroutines()来终止所有可以终止的协同程序,但这两个方法都只能终止该MonoBehaviour中的协同程序。

还有一种方法可以终止协同程序,即将协同程序所在GameObject的Active属性设置为false,当再次设置active为ture时,协同程序并不会再开启。

协同程序和多线程的区别?

3. 动态加载资源的方式?(有时候也问区别,具体请百度)

Resources.Load();Resources.LoadAll()

AssetBundle

Resources.Load 资源必须放在Resources文件夹,只能加载本地文件。

AssetBundle和WWW一起使用,可以实现从服务器上下载资源,并动态加载。

4. 使用unity3d实现2D游戏,有几种方式?

1.使用本身的GUI;

2.把摄像机的Projection(投影)值调为Orthographic(正交投影),不考虑z轴;

3.使用2d插件,如:2DToolKit、Uni2D;

4.Unity 4.3版本新增的Native 2D(原生)

5. AssetBundle

AssetBundle的管理总共分为三部分:1、AssetBundle文件2、AssetBundle内存镜像3、AssetBundle 内存对象实例

一张图读懂AssetBundle内存管理机制

file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wps3046.tmp.png

常见问题:

举一个例子说明AssetBundle如何进行内存释放?

一个常见的错误:你从某个AssetBundle里Load了一个prefab并克隆之:obj=Instantiate(AssetBundle1.Load('MyPrefab”);

这个prefab比如是个npc。

然后你不需要他的时候你用了:Destroy(obj);你以为就释放干净了。其实这时候只是释放了Clone对象,通过Load加载的所有引用、非引用Assets对象全都静静静的躺在内存里。

这种情况应该在Destroy以后用:AssetBundle1.Unload(true),彻底释放干净。

如果这个AssetBundle1是要反复读取的 不方便Unload,那可以在Destroy以后用:Resources.UnloadUnusedAssets()把所有和这个npc有关的Asset都销毁。

当然如果这个NPC也是要频繁创建销毁的那就应该让那些Assets呆在内存里以加速游戏体验。

由此可以解释另一个之前有人提过的话题:为什么第一次Instantiate一个Prefab的时候都会卡一下,因为在你第一次Instantiate之前,相应的Asset对象还没有被创建,要加载系统内置的AssetBundle并创建Assets,第一次以后你虽然Destroy了,但Prefab的Assets对象都还在内存里,所以就很快了。

问题:unity3d中如何实现动态资源加载?

使用AssetBundle技术,通过WWW类从服务器下载AssetBundle资源包,将需要的资源加载到项目中。AssetBundle资源包带有版本号,用来判断是否需要更新。

问题:AssetBunlde的优点?

可以动态加载资源

可以将资源放在服务器上,方便版本更新。

AssetBundle资源的加载和是否可以手动控制,方便资源管理。

6. 组件(组件思想)

是什么?

Unity3D面向对象编程最大的体现就是组件化,任何一个游戏对象都是通过附加不同的组件实现。每一个游戏对象都具有一个Transform组件。

问题:获取、增加、删除组件的命令分别是什么?

获取:GetComponent增加:AddComponent删除:Destroy

7. 物理引擎

物理引擎就是在游戏中模拟真实的物理效果。Unity内置了NVIDIA的Physx物理引擎,Physx是目前使用最为广泛的物理引擎,被很多游戏大作所采用,开发者可以通过物理引擎高效、逼真地模拟刚体碰撞、车辆驾驶、布料、重力等物理效果,使游戏画面更加真实而生动。

物理引擎主要包含三个核心内容:

1. Collider是最基本的触发物理的条件,例如碰撞检测。基本上,没有Collider物理系统基本没有意义(除了重力);

2. Rigidbody是物体的基本物理属性设置,当检测碰撞完之后,就要计算物理效果,而Rigidbody提供计算基本参数。

3. PhysicMaterial则是附加的基本物理参数,是一个物理材质,UNITY3D有自带默认的物理材质的系数(在Edit/Project Settings/Physic下设置),它参与碰撞的计算例如反弹效果摩擦效果等。

常见问题:

对Rigidbody施加力的常用方式?

AddForce 添加普通力;AddExplosionForce 添加爆炸力;AddForceAtPosition 添加位置力。

两个Collider产生碰撞的必要条件?

至少要有一个物体具有Rigibody刚体才会触发OnColliderEnter函数。

有碰撞器Collider

碰撞器和触发器的区别?

最大的区别是碰撞器有碰撞效果触发器没有;触发器是一个特殊的碰撞器。

Collider有几种?(三种)

1、Static Collider(静态碰撞器):带有Collider没有添加Rigidbody的对象,用于静止物体如地理环境;

2、Rigidbody collider:带有rigidbody的collider对象,能够根据物理引擎很好的响应外力和碰撞作用。

3、Kinematic rigidbody collider:带有rigidbody的collider对象,开启Is kinematic。

当物体进来OnTriggerEnter触发,出去时OnTriggerExit触发。那么物体在进来后Destory后会如何?

经过测试是:不会调用OnTriggerExit。

PhysicMaterial有哪些主要属性?

dynamicFriction:移动摩擦力,值在0到1之间。

staticFriction:静止摩擦力,值在0到1之间。

Bounciness:弹力,0值没有弹力,1-没有能量损失的反弹。

Character Controller(角色控制器)的特性

角色本身不受Physics影响,需要接受外力作用时,使用OnCharacterColliderHit();

使用角色控制器如何防止角色经常卡住?

Skin Width:设置为radius的10%;

Step offset:对于2meter(米)高的Character设为0.1到0.4;

Min move distance设为0即可。

Rigidbody常用属性?

打开Is Kinematic后物体不受物理引擎影响,只受Transform控制;

Freeze Position冻结位置轴向,Freeze Rotation冻结方向轴向,冻结之后的轴向只受Transform控制;

使用Physics时不要使用Transform

CharacterController和Rigidbody的区别?

CharacterController自带胶囊碰撞器,里面包含有刚体的属性;

Rigidbody就是刚体,使物体带有刚体的特征。

什么是Trigger?

Collider勾选Is Trigger属性,碰撞器变成触发器;

在物体发生碰撞的整个过程中,有几个阶段,分别列出对应的函数?

OnCollisionEnter(进入)、OnCollisionStay(保持)、OnCollisionExit(退出)

什么叫做链条关节?

Hinge Joint,可以模拟两个物体间用一根链条连接在一起的情况,能保持两个物体在一个固定距离内部相互移动而不产生作用力,但是达到固定距离后就会产生拉力。

8. 导航网格

参看PDF

9. 解释下A*寻路?

(AI是实时计算的,导航网格是自动计算的。AI可以自己研究算法,比导航网格更方便,导航网格被封装了。)

首先,A*算法的提出是为了解决游戏中从A点到目标B点绕过障碍物 寻找最短路径的问题。

其次,A*算法核心为:启发式搜索、估值函数、选取最小估值

最后,A*算法有优点也有缺点,它理论上将是时间最优的,但空间增长是指数级别的

10. 光照贴图(Lightmapping)

Lightmapping是一种增强静态场景光照效果的技术,较少的性能消耗使静态场景看上去更真实、丰富以及更具有立体感。

Unity使用Autodesk的Beast插件。

使用光照贴图的优点:

A:使用光照贴图比使用实时光源渲染要快 B:可以降低游戏内存消耗 C、多个物体可以使用同一张光照贴图

11. 后期屏幕渲染

参看PDF

12. 遮挡剔除

参看PDF

13. 插件

最喜欢的就是U3D中的插件系统,Unity3D中的插件极大得提高了开发效率。

问题:常用的插件有哪些?

NGUI、2D Toolkit、iTween、PlayMaker、特效插件FxMaker、NGJMinMap(小地图)等(最好多熟悉几个插件,问的时候好回答)

一 界面*** 推荐:NGUI

二 2D游戏*** 推荐:2D Toolkit //[ˈtu:lkɪt] 工具包,工具箱

三 可视化编程 推荐:PlayMaker

四 插值插件 推荐:iTween,HOTween

五 路径搜寻 推荐:Simple Path

14. iTween插件

是什么?iTween是一个动画库。

原理?iTween的核心是数值插值,简单说就是给iTween两个数值(开始值,结束值),它会自动生成一些中间值。

应用场景?对象移动、振屏效果

15. 协同程序Coroutine

协同程序,即在主程序运行时同时开启另一段逻辑处理,来协同当前程序的执行。换句话说,开启协同程序就是开启一个线程。

问题:协同程序有几种开启方式?

有两种。在Unity3D中,使用StartCoroutine(string methodName)和StartCoroutine(IEnumerator routine)都可以开启一个线程。区别在于使用字符串作为参数可以开启线程并在线程结束前终止线程,相反使用IEnumerator 作为参数只能等待线程的结束而不能随时终止(除非使用StopAllCoroutines()方法);另外使用字符串作为参数时,开启线程时最多只能传递一个参数,并且性能消耗会更大一点,而使用IEnumerator 作为参数则没有这个限制。

问题:如何终止协同程序?

使用StopCoroutine(string methodName)来终止一个协同程序,使用StopAllCoroutines()来终止所有可以终止的协同程序,但这两个方法都只能终止该MonoBehaviour中的协同程序。

还有一种方法可以终止协同程序,即将协同程序所在gameobject的active属性设置为false。

问题:协同程序和线程之间的区别?

协程和线程差不多,线程的调度是由操作系统完成的,协程把这项任务交给了程序员自己实现,当然也就可以提高灵活性,另外协程的开销比线程要小,在程序里可以开更多的协程。

线程与协同程序的主要区别在于,一个具有多线程的程序可以同时运行几个线程,而协同程序却需要彼此协作地运行。就是说,一个具有多个协同程序的程序在任何时刻只能运行一个协同程序,并且正在运行的协同程序只会在其显示地挂起时,它的执行才会暂停。

16. 动画系统

U3D中支持模型动画和骨骼动画,模型动画是模型中自包含的帧动画,使用Animation组件控制;骨骼动画使用Animator组件控制,也就是Mecanim系统,通过状态机和混合树控制动画的状态转换。骨骼动画应用最广泛。

问题:写出Animation的五个方法?

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

17. 如何实现游戏的暂停、加速和减速?

Time.timeScale = 0;即可让游戏暂停。

Time.timeScale=1时,Update、LateUpdate、FixedUpdate 都按正常的时间来执行。

Time.timeScale=2时,Update和 LateUpdate的执行速度是之前的2倍,而FixedUpdate还是按正常时间来执行。

18. 如何在Unity3D中使用单例模式?

先声明一个静态私有变量,如:instance;再声明一个静态公共方法,如:GetInstance,在该方法中判断instance为null时,通过GameObject.FindObjectOfType(typeof(MyClass))创建instance的实例(在C#中直接new一个新的实例),不为null则直接返回。

参考代码:

public class MyClass

{

private static MyClass instance;

public static MyClass GetInstance()

{

if (!instance)

{

instance = GameObject.FindObjectOfType(typeof(MyClass));

}

return instance;

}

}

19. 什么是游戏AI

游戏AI是游戏中的人工智能,AI中最常用到的是随机数Random和状态控制。

如怪物AI:巡逻(随机目标点)->发现->追赶->攻击->返回->继续巡逻

在实际项目中,AI脚本的参数往往设置成Public,供策划人员修改。如:攻击速度、技能类型、移动速度、命中率、攻击百分比

形成一个闭环,保证任何时候Ai可用

要能够画出逻辑图

20. Unity3D中脚本的编译顺序

脚本的编译过程分四步:

1. 编译所有 ”Standard Assets”, “Pro Standard Assets” or “Plugins” 目录下的代码

2. 编译所有“Standard Assets/Editor”, “Pro Standard Assets/Editor” or “Plugins/Editor” 目录下的代码

3. 编译除了上面列出来的目录和Editor目录之外的所有代码

4. 编译Editor目录下的代码

问题:如何在C#脚本中调用JS脚本中的方法?

如果你希望某个Javascript能被其他脚本引用,那么把它放到第一组的某个目录里,然后把要使用它的代码放在第三组的某个目录里就好了。

同样,如果希望某个C#代码能被其他Javascript脚本引用,也必须把这个C#脚本放到第一组的某个目录里,Javascript代码放到第三组的某个目录里。

编辑器类存放路径是什么?

工程目录下的Assets/Editor文件夹下。

21. U3D提供了一个用于保存读取数据的类,(playerPrefs),请列出保存读取整形数据的函数

PlayerPrefs.SetInt 与 PlayerPrefs.GetInt

22. unity3d从唤醒到销毁有一段生命周期,请列出系统自己调用的几个重要方法。

Awake –>OnEnable –> Start –> Update –> FixedUpdate –> LateUpdate –> OnGUI –> Reset –> OnDisable –> OnDestroy

23. 有两个相同的方法,放在两个脚本的Awake里,将这两个脚本放在同一个游戏对象上,先执行那个?(李老师原创)

跟脚本的添加顺序有关,后添加的先执行。由此可以推断游戏对象添加的组件以“栈”的数据结构保存,后进先出。

24. 物理更新一般在哪个系统函数里?

FixedUpdate,每固定帧绘制时执行一次,和update不同的是FixedUpdate是渲染帧执行,如果你的渲染效率低下的时候FixedUpdate调用次数就会跟着下降。FixedUpdate比较适用于物理引擎的计算,因为是跟每帧渲染有关。Update就比较适合做控制。

25. 移动相机动作在哪个函数里,为什么在这个函数里。

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

26. 当游戏中需要频繁创建一个物体对象时,我们需要怎么做来节省内存。

对象池,做一个pool,游戏开始时预先实例化足够的数量,然后用的时候取不用的时候收回

27. 一个场景放置多个camera并同时处于活动状态,会发生什么

实际看到的画面由多个camera的画面组成,由depth、Clear Flag、Culling Mask都会影响最终合成效果。

28. 简述prefab的用处和环境

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

29. 如何销毁一个UnityEngine.Object以及其子类

Destroy

30. 为什么u3d会出现组件上数据丢失的情况

一般是组件上绑定的物体对象被删除了

31. u3d下如何安全的在不同工程迁移asset数据

方法1,可以把assets目录和ProjectSetting目录一起迁移,

方法2,导出包

方法3,用unity带的assets server功能

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

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

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

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

骨骼动画,广泛应用的动画方式,集成了以上两个方式的优点,骨骼按角色特点组成一定的层次结构,由关节相连,可做相对运动,皮肤作为单一网格蒙在骨骼之外,决定角色的外观。皮肤网格每一个顶点都会受到骨骼的影响,从而实现完美的动画。(骨骼动画是由关节动画发展而来的,如今基本都使用骨骼动画来实现角色动画)

问题:写出Animation的五个方法

33. 如何优化内存?

有很多种方式,例如

1.压缩自带类库;

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

3.释放AssetBundle占用的资源;

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

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

34. 图像学底层原理(李老师原创)

1.GPU计算:顶点、线、三角、像素颜色(贴图)

2.(摄像机进行)可视化检测

3.调用显卡的底层渲染API(OpenGL、DX11)

-DrawPoint/DrawLine/DrawColor

35. NGUI核心原理?(原创)

UIGeomety(几何图形计算)->UIWebgit(部件)->UIPanel(容器分组)->UICamera(可视化检测)->UIDrawCall(渲染)

36. 坐标系

Unity3D采用左手坐标系

坐标系有:世界坐标系、屏幕坐标系、GUI坐标系

问题:localPosition与Position的使用区别?

localPosition:自身位置,相对于父级的变换的位置。

Position:在世界坐标transform的位置

37. 脚本

问题:怎么拿到一个对象上脚本的方法

GameObject.GetComponent<>();

38. 简述一下对象池,你觉得在FPS游戏里哪些东西适合使用对象池?

对象池就存放需要被反复调用资源的一个空间,比如游戏中要常被大量复制的对象,子弹,敌人,以及任何重复出现的对象。

39. 对象池的原理?(原创)

作用:复用,提高对象使用效率,避免频繁的销毁、创建操作。

过程:

预热-在使用之前批量创建对象

使用-从对象列表中获取

回收-隐藏

扩容-自动批量创建(使用对象达到总容量80%)

40. 角色换装怎么做?思路

1.模型贴图(类似人体彩绘)

2.Mesh Reander(换网格)

3.纸娃娃系统

41. 技能释放怎么做?

一般游戏中的技能都是粒子特效,结合输入控制粒子特效的播放。

42. 有限状态机

每个对象都维护自己的状态机,状态机的状态改变,靠状态触发器。每一个状态触发器都包含三个固定函数:Enter(进入)、Excute(执行)、Exit(退出)

请给我设计一个状态机,完成一个简单的xxxx情景。

答:状态机并不是单纯的switch结构,如果你是新手,你说switch我可以容忍,如果你干了好些年2Dx,然后想自废武功搞U3d了,再说switch就直接pass了。

FSM

FSMSystem 负责状态的切换

FSMState 表示各个状态基类,执行Excute、进入、退出、切换条件ChangeCheck

-Update

可以怪物AI来使用FSM

对比(伪代码)

Update()

If(state1)

{

If(state is 2)

{

//go to state2

}

Excute();

}

If(state2)

{

}

43. Unity 连接数据库

本地数据最常用的是SQLite,需要得到Mono.Data.Sqlite.dll 文件与System.Data.dll文件。

44. 本地数据存储方式?(原创)

文本:xml、json、excel(cvs)

数据库:SQLite

PlayerPrefes

45. 请描述MeshRender中material和shader的区别?

Shader(着色器)实际上就是一小段程序,它负责将输入的Mesh(网格)以指定的方式和输入的贴图或者颜色等组合作用,然后输出。绘图单元可以依据这个输出来将图像绘制到屏幕上。输入的贴图或者颜色等,加上对应的Shader,以及对Shader的特定的参数设置,将这些内容(Shader及输入参数)打包存储在一起,得到的就是一个Material(材质)

46. LayerMask.NameToLayer()这个方法有什么作用?

LayerMask的使用是按位操作的,LayerMask.NameToLayer("Players") 返回该Layer的编号。

在射线、摄像机遮罩剔除(Culling Mask)使用

47. itween插件的作用是什么,itween作用于世界坐标还是局部坐标,请列举出3个其常用方法?

iTween是一个动画库,作者创建它的目的就是最小的投入实现最大的产出。让你做开发更轻松,用它可以轻松实现各种动画,晃动,旋转,移动,褪色,上色,控制音频等等

方法:a、MoveTo 物体移动 ;b、ColorTo:随着时间改变对象的颜色组; c、LookTo:随时间旋转物体让其脸部朝向所提供的Vector3或Transform位置。

48. 什么是局部坐标,什么是世界坐标?

世界坐标是不会变的,一直以世界坐标轴的XYZ为标准。

局部坐标其实就是自身的坐标,会随着物体的旋转而变化的。

49. 以下哪个函数在游戏进入新场景后会被马上调用?

  MonoBehaviour.OnLevelWasLoaded

50. Mecanim系统中,Body Mask的作用是?

  指定身体的某一部分是否参与渲染

51. Material和Physic Material区别?

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

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

52.

动画层(Animation Layers)的作用是什么?

动画层作为一个具有层级动画编辑概念的工具,可以用来***和处理任何类型的动画

53. 请简述OnBecameVisible及OnBecameInvisible的发生时机,以及他们执行的意义?

当renderer(渲染器)在任何相机上都不可见时调用:OnBecameInvisible

当renderer(渲染器)在任何相机上可见时调用:OnBecameVisible

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

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.与旋转矩阵类似,两个四元组相乘可表示两次旋转

55. 说一下您在U3D游戏中用到的设计模式?

单例

MVC(NGUI的MVC架构:

1. 一个UI Panel(比如背包界面)打成一个预制件-View 封装

2. 背包数据放在Model里面

3. 行为控制对应一个Controler脚本

UI架构

unity常见面试题
http://www.unitymanual.com/thread-40958-1-1.html
(出处: -u3d游戏开发者社区【游戏蛮牛】)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: