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时,协同程序并不会再开启。
协同程序和多线程的区别?多线程程序同时运行多个线程 ,而在任一指定时刻只有一个协程在运行,并且这个正在运行的协同程序只在必要时才被挂起。除主线程之外的线程无法访问Unity3D的对象、组件、方法。
Unity3d没有多线程的概念,不过unity也给我们提供了StartCoroutine(协同程序)和LoadLevelAsync(异步加载关卡)后台加载场景的方法。 StartCoroutine为什么叫协同程序呢,所谓协同,就是当你在StartCoroutine的函数体里处理一段代码时,利用yield语句等待执行结果,这期间不影响主程序的继续执行,可以协同工作。而LoadLevelAsync则允许你在后台加载新资源和场景,所以再利用协同,你就可以前台用loading条或动画提示玩家游戏未卡死,同时后台协同处理加载的事宜asynchronous[e ɪˈ s ɪŋ kr ə n ə s] .synchronous同步。

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

Resources.Load 资源必须放在Resources文件夹,只能加载本地文件。
AssetBundle和WWW一起使用,可以实现从服务器上下载资源,并动态加载。

Unity资源加载的几种方式:

instantiate:最简单的一种方式,以实例化的方式动态生成一个物体。

Assetsbundle:即将资源打成 asset bundle 放在服务器或本地磁盘,然后使用WWW模块get 下来,然后从这个bundle中load某个object,unity官方推荐也是绝大多数商业化项目使用的一种方式。

AssetDatabase.loadasset :这种方式只在editor范围内有效,游戏运行时没有这个函数,它通常是在开发中调试用的。Resource.Load:可以直接load并返回某个类型的Object,前提是要把这个资源放在Resource命名的文件夹下,Unity不管有没有场景引用,都会将其全部打入到安装包中。

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如何进行内存释放?
一个常见的错误:你从某个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. 导航网格

NavMesh(导航网格)是3D游戏世界中用于实现动态物体自动寻路的一种技术,将游戏中复杂的结构组织关系简化为带有一定信息的网格,在这些网格的基础上通过一系列的计算来实现自动寻路。。导航时,只需要给导航物体挂载导航组建,导航物体便会自行根据目标点来寻找最直接的路线,并沿着该线路到达目标点。

https://www.cnblogs.com/jiangshuai52511/p/6226358.html

9. 解释下A*寻路?(需要后续进行深入了解)
(AI是实时计算的,导航网格是自动计算的。AI可以自己研究算法,比导航网格更方便,导航网格被封装了。)
首先,A*算法的提出是为了解决游戏中从A点到目标B点绕过障碍物 寻找最短路径的问题。
其次,A*算法核心为:启发式搜索、估值函数、选取最小估值
最后,A*算法有优点也有缺点,它理论上将是时间最优的,但空间增长是指数级别的。

10. 光照贴图(Lightmapping)
Lightmapping是一种增强静态场景光照效果的技术,较少的性能消耗使静态场景看上去更真实、丰富以及更具有立体感。
Unity使用Autodesk的Beast插件。
使用光照贴图的优点:
A:使用光照贴图比使用实时光源渲染要快 B:可以降低游戏内存消耗 C、多个物体可以使用同一张光照贴图

11. 后期屏幕渲染https://www.jianshu.com/p/aa753721ba2c

Image Effects图像特效主要应用在Camera对象上,可以让游戏画面带来丰富的视觉效果,使得游戏画面更具艺术感和个性。
U3D的大部分特效可以混合使用,U3D的图像特效都在OnRenderImage()函数中在图像到达颜色缓存进行显示交换前进行的图像处理,任何附加在摄像机上的Image Effects脚本都可以通过编辑其代码来修改特效的效果。
所有的后期屏幕特效只有pro版本才支持。
使用步骤:
Image Effects的脚本组件添加到摄像机上。
详细组件:
1)Antialiasing(Fullscreen)脚本抗锯齿全屏特效,NFAA、FXAA3、FXAA2、DLAA较快。
具体有边缘阈值,模糊半径,清晰度等设置。
2)Bloom脚本泛光特效,是增强版的辉光(类似高光耀斑),光晕(光晕和模糊)效果。
调节泛光的质量等级,模式,混合模式(屏幕是两张图像分别处理,Add叠加模式光晕会更亮),HDR高动态光照渲染开关, 泛光强度,阈值,Blur iterations模糊迭代效果。 Mask光晕遮蔽图。
3) Bloom and Lens Flares 泛光和镜头炫光效果
泛光效果下增加镜头炫光(耀斑效果),和Bloom效果类似,只是是3.5版本的。
4)Blur 脚本模糊特效,迭代次数越多越模糊,模糊半径,模糊shader的选择。
5)Camera Motion Blur基于摄像机的运动模糊特效,模拟物体相对于摄像机作快速移动时产生的模糊效果。
有运动模糊算法的选择,速度尺度,最小速度,摄像机移动,排除层不受模糊计算影响的层,抖动采样设置,最大采样数设置。
6)Color Correction色彩校正特效,有曲线类型,渐变纹理类型。
7)Contrast Enhance对比度增强特效,使用图像处理领域中非锐化遮蔽图(unsharp mask)方式来达到增强对比度的效果,使得图像明亮的更加明亮,暗淡的更加暗淡。
8)Contrast Stretch 对比度拉伸特效。实现从黑暗空间中到明亮的空间时产生的眩目的感觉。
9)Crease 折皱特效,使得边缘更加明显粗糙,类似手绘效果。
10)Depth of field景深特效,使得边缘朦胧,或者物体朦胧,产生视觉上景色深度效果。
Tilt Shift 移轴特效,是景深特效的特殊版本,使得闪焦区域的过渡更加光滑。
11)Edge Detection 边缘检测特效(分为颜色和几何)。类似手绘边缘效果。
12)FishEye 鱼眼效果。
13)Global Fog全局雾效果。
14)Glow 发光效果。
15) Grayscale灰度特效。
16)Motion Blur(Color Accumulation)运动模糊特效。
17)Noise噪波图像特效,老式电影和电视的 哗哗 效果。
18)Sepia Tone棕褐色效果。
19)Screen Space Ambient Occlusion 屏幕空间环境遮挡(SSAO)特效。
20) SunShafts: 阳光射线特效。
阳光射线特效用于模拟亮度很高的光源被物体遮挡时所产生的径向光线散射效果,合理运用该特效能有效地提升游戏画面的真实感。
21) Tonemapping 色调映射特效,该特效只有在摄像机对象启用HDR模式时才能正常工作,可以增加视觉方向的光照细节表现,模拟人眼适应环境明暗交替效果,可以和Bloom配合得到更好效果。
22) Twirl 扭曲特效,Vortex旋涡图像特效类似扭曲特效。
23)Vignettinggand Chromatic Aberration 渐晕和色差特效,也是有模糊效果

12. 遮挡剔除https://blog.csdn.net/qq_33747722/article/details/70549006

遮挡剔除 (Occlusion Culling) 功能可在对象因被其他物体遮挡,当前在相机中无法看到时,禁用对象渲染。该功能不会在三维计算机图形中自动开启,因为在大部分情况下,离相机最远的对象最先渲染,离相机近的对象覆盖先前的物体(该步骤称之为“重复渲染 (overdraw)”)。遮挡剔除 (Occlusion Culling) 与视锥体剔除 (Frustum Culling) 不同。视锥体剔除 (Frustum Culling) 只禁用相机视野外的对象渲染,不禁用视野中被遮挡的任何物体的渲染。注意,使用遮挡剔除 (Occlusion Culling) 功能时,仍将受益于视锥体剔除 (Frustum Culling)。

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。
问题:协同程序和线程之间的区别?
协程和线程差不多,线程的调度是由操作系统完成的,协程把这项任务交给了程序员自己实现,当然也就可以提高灵活性,另外协程的开销比线程要小,在程序里可以开更多的协程。
线程与协同程序的主要区别在于,一个具有多线程的程序可以同时运行几个线程,而协同程序却需要彼此协作地运行。就是说,一个具有多个协同程序的程序在任何时刻只能运行一个协同程序,并且正在运行的协同程序只会在其显示地挂起时,它的执行才会暂停。

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中使用了这种动画。
单一网络模型动画由一个完整的网格模型构成,在动画序列的关键帧里记录各个顶点的原位置及其改变量,然后插值运算实现动画效果,角色动画较真实。
骨骼动画,广泛应用的动画方式,集成了以上两个方式的优点,骨骼按角色特点组成一定的层次结构,由关节相连,可做相对运动,皮肤作为单一网格蒙在骨骼之外,决定角色的外观。皮肤网格每一个顶点都会受到骨骼的影响,从而实现完美的动画。(骨骼动画是由关节动画发展而来的,如今基本都使用骨骼动画来实现角色动画)

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

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脚本

发布了97 篇原创文章 · 获赞 21 · 访问量 28万+

猜你喜欢

转载自blog.csdn.net/sun124608666/article/details/103968556