《Unity面试题》 |
版本 |
作者 |
参与者 |
完成日期 |
备注 |
Unity_JobView_V01_1.0 |
严立钻 |
|
2018.07.26 |
|
|
|
|
|
|
#Unity面试题ABC:https://blog.csdn.net/VRunSoftYanlz/article/details/78630687 #Unity面试题DEF:https://blog.csdn.net/VRunSoftYanlz/article/details/78630838
|
##《Unity面试题》发布说明:
++++“Unity面试题”是对在Unity职位面试中相关技术点的总结,立钻哥哥按照一个简单的章节分类进行整理。
++++当然,这些技术点有些是Unity常用的技术点,有些是各种面试题筛选整理,也有些是对Unity面试点的推断拓展。
++++“Unity面试题”将打造成Unity技术宝库,不但是面试的重要参考资料,也是对Unity知识点的汇总。
++++“Unity面试题”将采用简单概述,不拓展,将每个技术点限定在简短篇幅中。
++++Unity面试题ABC:https://blog.csdn.net/vrunsoftyanlz/article/details/78630687
++++Unity面试题D:https://blog.csdn.net/VRunSoftYanlz/article/details/78630838
++++Unity面试题E:https://blog.csdn.net/vrunsoftyanlz/article/details/78630913
++++Unity面试题F:https://blog.csdn.net/VRunSoftYanlz/article/details/78630945
##《Unity面试题》目录:
#第一篇:Unity经典面试题
#第二篇:C#问题
#第三篇:Unity问题
#第四篇:Unity模拟面试
#第五篇:Unity面试进阶
#第六篇:立钻哥哥带您高薪就业
#第四篇:Unity模拟面试 |
##4D.01、Unity第一次模拟面试 |
++4D.01、Unity第一次模拟面试
++++4D.01.01、哪种实时光源是Unity中没有的?
++++4D.01.02、如何在Unity中创建地形系统?
++++4D.01.03、以下哪种操作步骤可以在场景中添加“Wind Zone”?
++++4D.01.04、在Unity编辑器中创建一个Directional Light,以下步骤正确的是?
++++4D.01.05、下列哪一项不属于Camera中的“Clear Flags”?
++++4D.01.06、以下哪种脚本语言是Unity编辑器所不支持的?
++++4D.01.07、对于Prefab,以下说法错误的是?
++++4D.01.08、下面哪种做法可以打开Unity的Asset Store?
++++4D.01.09、在哪个面板中可以修改物体的空间属性,如位置、朝向、大小等?
++++4D.01.10、如何为一个Asset资源设定一个Label,从而能够方便准确的搜索到?
++++4D.01.11、Mecanim系统中,Body Mask的作用是?
++++4D.01.12、以下哪种操作步骤可以打开Unity编辑器的Lightmapping视图?
++++4D.01.13、下列关于光照贴图,说法错误的是?
++++4D.01.14、如何为物体添加光照贴图所使用的UV?
++++4D.01.15、在哪个模块下可以修改Render Path?
++++4D.01.16、以下哪项技术不是目前Unity所支持的Occlusion Culling技术?
++++4D.01.17、关于Vector3的API,以下说法正确的是?
++++4D.01.18、以下哪个函数在游戏进入新场景后会被马上调用?
++++4D.01.19、什么是导航网格(NavMesh)?
++++4D.01.20、下列哪些选项不是网格层属性的固有选项?
++++4D.01.21、在场景中放置多个Camera并同时处于活动状态使会发生什么?
++++4D.01.22、请简述Prefab的作用,并描述如何在移动设备的环境下恰当的使用它?
++++4D.01.23、如何销毁一个UnityEngine.Object及其子类?
++++4D.01.24、请简述为什么Unity3D中会发生在组件上出现数据丢失的情况(missing)?
++++4D.01.25、请简述Unity3D下如何安全的在不同工程间迁移Asset数据,请举出三种方式?
###4D.01.01、哪种实时光源是Unity中没有的? |
++4D.01.01、哪种实时光源是Unity中没有的?
++++立钻哥哥:B
++++A、点光源;
++++B、方向光;
++++C、聚光灯;
++++D、日光灯;
###4D.01.02、如何在Unity中创建地形系统? |
++4D.01.02、如何在Unity中创建地形系统?
++++立钻哥哥:A
++++A、Terrain -> Create Terrain;
++++B、Component -> Create Terrain;
++++C、Asset -> Create Terrain;
++++D、Windows -> Create Terrain;
###4D.01.03、以下哪种操作步骤可以在场景中添加“Wind Zone”? |
++4D.01.03、以下哪种操作步骤可以在场景中添加“Wind Zone”?
++++立钻哥哥:B
++++A、Terrain -> Wind Zone;
++++B、GameObject -> Create Other -> Wind Zone;
++++C、Component -> Physics -> Wind Zone;
++++D、Assets -> Create -> Wind Zone;
###4D.01.04、在Unity编辑器中创建一个Directional Light,以下步骤正确的是? |
++4D.01.04、在Unity编辑器中创建一个Directional Light,以下步骤正确的是?
++++立钻哥哥:B
++++A、Edit -> Rendering Setting -> Directional Light;
++++B、GameObject -> Create Other -> Directional Light;
++++C、Component -> Rendering -> Directional Light;
++++D、Assets -> Directional Light;
###4D.01.05、下列哪一项不属于Camera中的“Clear Flags”? |
++4D.01.05、下列哪一项不属于Camera中的“Clear Flags”?
++++立钻哥哥:D
++++A、Skybox;
++++B、Solid Color;
++++C、Depth Only;
++++D、Background;
###4D.01.06、以下哪种脚本语言是Unity编辑器所不支持的? |
++4D.01.06、以下哪种脚本语言是Unity编辑器所不支持的?
++++立钻哥哥:D
++++A、JavaScript;
++++B、C#;
++++C、Boo;
++++D、Perl;
###4D.01.07、对于Prefab,以下说法错误的是? |
++4D.01.07、对于Prefab,以下说法错误的是?
++++立钻哥哥:D
++++A、Prefab资源可以在项目中多次重复使用;
++++B、由Prefab实例出的GameObject,其在Hierarchy视图中表现为蓝色;
++++C、Prefab上的组件信息一经改变,其实例出的GameObject也会自动改变;
++++D、实例出的GameObject上的组件信息一经改变,其对应的Prefab也会自动改变;
###4D.01.08、下面哪种做法可以打开Unity的Asset Store? |
++4D.01.08、下面哪种做法可以打开Unity的Asset Store?
++++立钻哥哥:A
++++A、Windows -> Asset Store;
++++B、Edit -> Asset Store;
++++C、File -> Asset Store;
++++D、Assets -> Asset Store;
###4D.01.09、在哪个面板中可以修改物体的空间属性,如位置、朝向、大小等? |
++4D.01.09、在哪个面板中可以修改物体的空间属性,如位置、朝向、大小等?
++++立钻哥哥:B
++++A、Project;
++++B、Inspector;
++++C、Hierarchy;
++++D、Toolbar;
###4D.01.10、如何为一个Asset资源设定一个Label,从而能够方便准确的搜索到? |
++4D.01.10、如何为一个Asset资源设定一个Label,从而能够方便准确的搜索到?
++++立钻哥哥:D
++++A、在Project窗口中选中一个Asset,右键->Create->Label;
++++B、在Project窗口中选中一个Asset,右键->Add Label;
++++C、在Project窗口中选中一个Asset,在Inspector窗口中点击添加Label的图标;
++++D、在Project窗口中选中一个Asset,在Inspector窗口中点击按钮“Add Label”;
###4D.01.11、Mecanim系统中,Body Mask的作用是? |
++4D.01.11、Mecanim系统中,Body Mask的作用是?
++++立钻哥哥:D
++++A、指定身体的某一部分是否参与骨骼动画;
++++B、指定身体的某一部分是否参与物理模拟;
++++C、指定身体的某一部分是否可以输出骨骼信息;
++++D、指定身体的某一部分是否参与渲染;
###4D.01.12、以下哪种操作步骤可以打开Unity编辑器的Lightmapping视图? |
++4D.01.12、以下哪种操作步骤可以打开Unity编辑器的Lightmapping视图?
++++立钻哥哥:C
++++A、File -> Lightmapping;
++++B、Assets -> Lightmapping;
++++C、Windows -> Lightmapping;
++++D、Component -> Lightmapping;
###4D.01.13、下列关于光照贴图,说法错误的是? |
++4D.01.13、下列关于光照贴图,说法错误的是?
++++立钻哥哥:C
++++A、使用光照贴图比使用实时光源渲染要快;
++++B、可以降低游戏内存消耗;
++++C、可以增加场景真实感;
++++D、多个物体可以使用同一张光照贴图;
###4D.01.14、如何为物体添加光照贴图所使用的UV? |
++4D.01.14、如何为物体添加光照贴图所使用的UV?
++++立钻哥哥:A
++++A、不同添加,任何时候都会自动生成;
++++B、更改物体导入设置,勾选“Generate Lightmap UVs”;
++++C、更改物体导入设置,勾选“Swap UVs”;
++++D、更改物体导入设置,在UVs选项中选择“Use Lightmaps”;
###4D.01.15、在哪个模块下可以修改Render Path? |
++4D.01.15、在哪个模块下可以修改Render Path?
++++立钻哥哥:D
++++A、Camera;
++++B、Light;
++++C、Render Settings;
++++D、Project Settings -> Quality;
###4D.01.16、以下哪项技术不是目前Unity所支持的Occlusion Culling技术? |
++4D.01.16、以下哪项技术不是目前Unity所支持的Occlusion Culling技术?
++++立钻哥哥:B、D
++++A、PVS only;
++++B、PVS and dynamic objects;
++++C、Automatic Partal Generation;
++++D、Dynamic Only;
###4D.01.17、关于Vector3的API,以下说法正确的是? |
++4D.01.17、关于Vector3的API,以下说法正确的是?
++++立钻哥哥:B
++++A、Vector3.normalize可以获取一个三维向量的法线向量;
++++B、Vector3.magnitude可以获取一个三维向量的长度;
++++C、Vector3.forward与Vector3(0,0,1)是一样的意思;
++++D、Vector3.Dot(向量A,向量B)是用来计算向量A与向量B的叉积;
###4D.01.18、以下哪个函数在游戏进入新场景后会被马上调用? |
++4D.01.18、以下哪个函数在游戏进入新场景后会被马上调用?
++++立钻哥哥:C
++++A、MonoBehaviour.OnSceneWasLoaded;
++++B、MonoBehaviour.OnSceneEnter;
++++C、MonoBehaviour.OnLevelWasLoaded;
++++D、MonoBehaviour.OnLevelEnter;
###4D.01.19、什么是导航网格(NavMesh)? |
++4D.01.19、什么是导航网格(NavMesh)?
++++立钻哥哥:D
++++A、一种用于描述相机轨迹的网格;
++++B、一种被优化过的物体网格;
++++C、一种用于物理碰撞的网格;
++++D、一种用于实现自动寻路的网络;
###4D.01.20、下列哪些选项不是网格层属性的固有选项? |
++4D.01.20、下列哪些选项不是网格层属性的固有选项?
++++立钻哥哥:A
++++A、Default;
++++B、Walkable;
++++C、Not Walkable;
++++D、Jump;
###4D.01.21、在场景中放置多个Camera并同时处于活动状态使会发生什么? |
++4D.01.21、在场景中放置多个Camera并同时处于活动状态使会发生什么?
++++立钻哥哥:多个Camera与depth有关;
###4D.01.22、请简述Prefab的作用,并描述如何在移动设备的环境下恰当的使用它? |
++4D.01.22、请简述Prefab的作用,并描述如何在移动设备的环境下恰当的使用它?
++++立钻哥哥:
###4D.01.23、如何销毁一个UnityEngine.Object及其子类? |
++4D.01.23、如何销毁一个UnityEngine.Object及其子类?
++++立钻哥哥:直接Destroy,不管是对象还是组件;
###4D.01.24、请简述为什么Unity3D中会发生在组件上出现数据丢失的情况(missing)? |
++4D.01.24、请简述为什么Unity3D中会发生在组件上出现数据丢失的情况(missing)?
++++立钻哥哥:其实就是关系丢失了(Library目录),基本上就是没有在Unity里改名,改变位置就会出这个问题。
###4D.01.25、请简述Unity3D下如何安全的在不同工程间迁移Asset数据,请举出三种方式? |
++4D.01.25、请简述Unity3D下如何安全的在不同工程间迁移Asset数据,请举出三种方式?
++++立钻哥哥:方法1:可以把Assets目录和Library目录一起迁移;
++++方法2:导出包;
++++方法3:用Unity带的Assets server功能;
++++说明:个人认为只有一种方法:就是先导出UnityPackage格式,再导入另外一个项目;
##4D.02、Unity第二次模拟面试 |
++4D.02、Unity第二次模拟面试
++++4D.02.01、写出一个人物角色的有限状态机的简略代码,包括静止、移动、战斗、死亡几个状态的切换?
++++4D.02.02、列举出影响游戏画面DrawCall的因素以及优化方案?
++++4D.02.03、如图所示向量坐标关系,正确的是?
++++4D.02.04、下面描述可以减少GC(垃圾回收)的是?
++++4D.02.05、下面关于private,public,protected,internal的描述正确的是?
++++4D.02.06、MeshRender中material和sharedmaterial的区别?
++++4D.02.07、如何优化内存有哪些?
++++4D.02.08、下列关于栈的描述正确的是?
++++4D.02.09、二叉树的第K层的结点数最多为?
++++4D.02.10、C#中关于传值和传引用的说法正确的是?
++++4D.02.11、C#抽象类(abstract)和接口(interface)的区别?
++++4D.02.12、委托(delegate)与事件的区别?
++++4D.02.13、进程间通信有哪些方式?
++++4D.02.14、下面关于Unity协程正确的是?
++++4D.02.15、Arrange the event functions listed below in the order in which they will be invoked?
++++4D.02.16、Which of the following examples will run faster? Explain your answer?
++++4D.02.17、Answer the following questions about threading, Explain your answers?
++++4D.02.18、What is Prefabs in Unity 3D?
++++4D.02.19、请描述一下Unity中position,localPosition以及anchoredPosition之间的区别?
++++4D.02.20、Use coroutine to move a 2d game object from position(10, 5) to position (20, -5) within 2 seconds?
###4D.02.01、写出一个人物角色的有限状态机的简略代码,包括静止、移动、战斗、死亡几个状态的切换? |
++4D.02.01、写出一个人物角色的有限状态机的简略代码,包括静止、移动、战斗、死亡几个状态的切换?
++++立钻哥哥:有限状态机(Finite-State machine,FSM),又称有限状态自动机,简称状态机,是表示有限个状态以及在这些状态之间的转移和动作等行为的数学模型。
++++有限状态机(FSM)是游戏AI的一种常见模型。
++++FSM的结构和逻辑:
--1、AIController:用于实现各种行为动作,它作为AI行为动作的控制器;
--2、FSM:用于存放判断参数和统一调用各状态机;
--3、IState:状态机接口,等待各种状态机实现其功能;
--4、MoveState,AttackState,IdleState,DieState:各种State,每个状态机内部实现开关逻辑;
++++【1、创建一个AIController】:创建一个AIController,绑定在怪物身上,用于控制怪物动作:
public class AIController : MonoBehaviour{
public FSM fsm;
void Start(){
fsm = GetComponent<FSM>();
fsm.ac = this;
//立钻哥哥:初始化一个默认状态机
fsm.ChangeState(new MoveState());
}
public void Move(){
Debug.Log(“立钻哥哥:----move----”);
}
public void Attack(){
Debug.Log(“立钻哥哥:----attack----”);
}
} //立钻哥哥:public class AIController:MonoBehaviour{}
++++【2、创建一个FSM】:FSM用于传递状态机,创建一个FSM绑定在怪物身上:
public class FSM : MonoBehaviour{
public IState currentState{ get; private set; }
public bool isCanAttack;
public bool isCanMove;
public AIController ac;
void Start(){
}
public void ChangeState(IState newState){
currentState = newState;
}
void Update(){
if(currentState != null && ac != null){
currentState.Execute(ac);
}
}
} //立钻哥哥:public class FSM : MonoBehaviour{}
++++【3、创建一个状态机接口:IState】:
public interface IState{
void Execute(AIController ac);
} //立钻哥哥:public interface IState{}
++++【4、创建多个状态机】:在状态机中实现判断和调用AIController的行为方法:
//4.1、MoveState.cs
public class MoveState : IState{
public void Execute(AIContoller ac){
if(ac.fsm.isCanMove){
ac.Move();
}else{
ac.fsm.ChangeState(new IdleState());
}
} //立钻哥哥:public void Execute(AIController ac)
} //立钻哥哥:public class MoveState:IState{}
//4.2、AttackState.cs
public class AttackState : IState{
public void Execute(AIController ac){
if(ac.fsm.isCanAttack){
ac.Attack();
}else{
as.fsm.ChangeState(new MoveState());
}
} //立钻哥哥:public void Execute(AIController ac){}
} //立钻哥哥:public class AttackState:IState{}
###4D.02.02、列举出影响游戏画面DrawCall的因素以及优化方案? |
++4D.02.02、列举出影响游戏画面DrawCall的因素以及优化方案?
++++立钻哥哥:每次引擎准备数据并通知GPU的过程称为一次Draw Call。(是CPU调用底层图形接口。)
++++DrawCall优化可以从:CPU方面、GPU方面、内存方面等入手;
++++【1、CPU方面的优化】:drawcall影响的是CPU的效率,优化的主要思路:减少渲染次数,多个物体最好一次渲染:
--1、使用Draw Call Batching:调用批处理;(静态批处理Static Batching、动态批处理Dynamic Batching)
--2、通过纹理打包成图集来尽量减少材质的使用;
--3、尽量少的使用反光,阴影之类的,因为会使物体多次渲染;
++++【2、GPU方面的优化】:影响GPU性能的两大方面:一方面是顶点数量过多,像素计算过于复杂;另一方面就是GPU的显存带宽。
--1、减少顶点数量,简化计算复杂度;
----1.1、保持材质的数目尽可能少。(这使得Unity更容易进行批处理)
----1.2、使用纹理图集(一张大贴图里包含了很多子贴图)来代替一系列单独的小贴图。(纹理图集可以更快地被加载,具有很少的状态转换,而且批处理更友好。)
----1.3、如果使用了纹理图集和共享材质,使用Renderer.sharedMaterial来代替Renderer.material;
----1.4、使用光照贴图(lightmap)而非实时灯光;
----1.5、使用LOD,好处就是对那些离得远,看不清的物体的细节可以忽略;
----1.6、遮挡剔除(Occlusion culling);
----1.7、使用mobile版的Shader,因为简单。
--2、压缩图片,以适应显存带宽;
----2.1、OpenGL ES 2.0使用ETC1格式压缩等等,在打包设置那里都有;
----2.2、使用Mipmap。(会消耗一些内存,但是为了图片渲染的质量(比压缩要好),这种方式也是推荐的。)
++++【3、内存方面的优化】:Unity游戏引擎内存大概分:1、Unity3D内部的内存;2、Mono的托管内存;3、若干我们自己引入的DLL或者第三方DLL所需的内存;
++++补充1:Unity中,每次引擎准备数据并通知GPU的过程称为一次DrawCall。(DrawCall越高对显卡的消耗就越大)。降低DrawCall的方法:
--1、Dynamic Batching:动态批处理;
--2、Static Batching:静态批处理;
--3、高级特性Shader降级为统一的低级特性的Shader;
++++补充2:LightMap光照贴图的优点:避免动态光照在场景中的实时渲染,减少DrawCall。
###4D.02.03、如图所示向量坐标关系,正确的是? |
++++立钻哥哥:
++++A、c=a+b;
++++B、c=a-b;
++++C、c=b-a;
++++D、c=-(a+b);
++++剖析:向量运算是3D图形,物理,动画的基础。
--1、向量加法(Addition):两个向量相加时,结果等于把这两个向量作为台阶,注意,两个向量的顺序不重要,结果是一样的。(如果第一个向量是空间中的点,则可以把第二个向量理解成一个“偏移量”)(如果向量表示的是力,那就可以更直观认为它是力的方向和大小(magnitude)。两个表示力的向量相加的结果是一个新的向量,这个向量等于两个力的结合。这个概念在使用多力的组件时非常有用。)
--2、向量减法(Subtraction):向量减法常用于取得一个对象到另一个对象之间的方向和距离。(注意减法式子中的参数顺序会影响到结果)
###4D.02.04、下面描述可以减少GC(垃圾回收)的是? |
++4D.02.04、下面描述可以减少GC(垃圾回收)的是?
++++立钻哥哥:A、B、C
++++A、减少new产生对象的次数;
++++B、使用公用的对象(静态成员);
++++C、将String换成StringBuilder;
++++D、减少循环体循环次数;
###4D.02.05、下面关于private,public,protected,internal的描述正确的是? |
++4D.02.05、下面关于private,public,protected,internal的描述正确的是?
++++立钻哥哥:A、B、C、D
++++A、public:对任何类和成员都公开,无限制访问;
++++B、private:仅对类公开;
++++C、protected:对该类和其派生类公开;
++++D、internal:只能在包含该类程序集中访问该类;
###4D.02.06、MeshRender中material和sharedmaterial的区别? |
++4D.02.06、MeshRender中material和sharedmaterial的区别?
++++立钻哥哥:A、D
++++A、修改sharedMaterial将改变所有使用这个材质的物体外观;
++++B、修改Material将改变所有使用这个材质的物体外观;
++++C、修改sharedMaterial只改变使用当前材质的物体的外观;
++++D、修改Material只改变使用当前材质的物体的外观;
###4D.02.07、如何优化内存有哪些? |
++4D.02.07、如何优化内存有哪些?
++++立钻哥哥:A、B
++++A、释放AssetBundle占用的资源;
++++B、将暂时不用的以后还需要使用的物体隐藏起来而不是直接Destroy掉;
++++C、减少网络请求参数;
++++D、启用MipMap;
###4D.02.08、下列关于栈的描述正确的是? |
++4D.02.08、下列关于栈的描述正确的是?
++++立钻哥哥:D
++++A、栈是非线性结构;
++++B、栈是一种树状结构;
++++C、栈具有先进先出的特性;
++++D、栈具有后进先出的特性;
###4D.02.09、二叉树的第K层的结点数最多为? |
++4D.02.09、二叉树的第K层的结点数最多为?
++++立钻哥哥:A
++++A、2^(k - 1);
++++B、2^(k + 1);
++++C、2(k - 1);
++++D、2k + 1;
++++补充1:二叉树性质1:在二叉树第K层上的节点数最多有2^(k-1);
###4D.02.10、C#中关于传值和传引用的说法正确的是? |
++4D.02.10、C#中关于传值和传引用的说法正确的是?
++++立钻哥哥:A、B、C
++++A、值类型变量存储在栈上;
++++B、引用类型表示的对象存储在堆上;
++++C、传值是直接将实参的值赋给形参;
++++D、传引用是将引用代表的对象拷贝后传给函数;
###4D.02.11、C#抽象类(abstract)和接口(interface)的区别? |
++4D.02.11、C#抽象类(abstract)和接口(interface)的区别?
++++立钻哥哥:A、B、C
++++A、C#抽象类可以有自己的实现;
++++B、C#中可以实现多个接口;
++++C、C#只能继承一个抽象类;
++++D、C#可以继承多个抽象类;
###4D.02.12、委托(delegate)与事件的区别? |
++4D.02.12、委托(delegate)与事件的区别?
++++立钻哥哥:???
++++A、委托是一种安全的函数类型;
++++B、事件是一种消息机制;
++++C、事件可以携带方法体;
++++D、委托可以携带方法体;
###4D.02.13、进程间通信有哪些方式? |
++4D.02.13、进程间通信有哪些方式?
++++立钻哥哥:A、B、C
++++A、管道通信;
++++B、消息通信;
++++C、共享内存;
++++D、静态变量;
++++补充1:进程间通信(IPC)的4种通信方式:
--管道:速度慢,容量有限,只有父子进程能通讯;
--消息队列:容量受到系统限制,且要注意第一次读的时候,要考虑上一次没有读完数据的问题;
--信号量:不能传递复杂消息,只能用来同步;
--共享内存区:能够很容易控制容量,速度快,但要保持同步。
###4D.02.14、下面关于Unity协程正确的是? |
++4D.02.14、下面关于Unity协程正确的是?
++++立钻哥哥:C
++++A、协程是不占用主线程资源;
++++B、协程不会阻塞后续执行序列;
++++C、协程可以操作UI;
++++D、协程是线程安全的;
###4D.02.15、Arrange the event functions listed below in the order in which they will be invoked? |
++4D.02.15、Arrange the event functions listed below in the order in which they will be invoked?
Update();
OnGUI();
OnDisable();
Start();
LateUpdate();
OnEnable();
OnApplicationQuit();
OnDestroy();
++++立钻哥哥:【Awake()】=>【OnEnable()】=>【Start()】=>【FixedUpdate()】=>【Update()】=>【LateUpdate()】=>【OnBecameVisible()】=>【OnGUI()】=>【OnBecameInvisible()】=>【OnDisable()】=>【OnDestroy()】=>【OnApplicationQuit()】
###4D.02.16、Which of the following examples will run faster? Explain your answer? |
++4D.02.16、Which of the following examples will run faster? Explain your answer?
++++立钻哥哥:B
++++A、1000 GameObjects, each with a MonoBehaviour implementing the Update callback;
++++B、One GameObject with one MonoBehaviour with an Array of 1000 classes, each implementing a custom Update() callback;
++++补充A、1000个GameObject,每个GameObjects都有一个实现更新回调的整体行为;
++++补充B、一个GameObject,一个MonoBehaviour,用1000个类的数组实现,每个类实现一个自定义Update()回调;
###4D.02.17、Answer the following questions about threading, Explain your answers? |
++4D.02.17、Answer the following questions about threading, Explain your answers?
--1、Can threads be used to modify a Texture on runtime?
--2、Can threads be used to move a GameObject on the scene?
--3、Consider the snippet below:
class RandomGenerator : MonoBehaviour{
public float[] randomList;
void Start(){
randomList = new float[1000000];
}
void Generate(){
System.Random rnd = new System.Random();
for(int i = 0; i < randomList.Length; i++){
randomList[i] = (float)rnd.NextDouble();
}
}
}
--Improve this code using threads, so the 1000000 random number generation runs without spoiling performance。
++++立钻哥哥:回答下面有关线程的问题:
++++1、能在运行时使用线程修改一张texture吗?
++++2、能在线程中移动一个场景中的游戏对象吗?
--只用在主线程中才可以修改UI和View,子线程中不可以修改texture和移动GameObject;
++++3、把代码移到线程中:
//例如使用类似loom.cs工具类,能简单的将一段代码甩到子线程中执行,核心是对C#的线程池的封装,以便在Unity中使用多线程:
//启动子线程
public static Thread RunAsync(Action a){
ThreadPool.QueueUserWorkItem(RunAction, a);
return null;
}
//回到主线程的封装:
public static void QueueOnMainThread(Action action);
//使用方法:
Loom.RunAsync(delegate(){
for(int i = 0; i < length; i++){
//立钻哥哥:产生随机数
}
});
###4D.02.18、What is Prefabs in Unity 3D? |
++4D.02.18、What is Prefabs in Unity 3D?
++++立钻哥哥:Prefab是一种资源类型:存储在项目视图中的一种可反复使用的游戏对象。因而当游戏中须要非常多反复使用的对象、资源等时,就可以用Prefab了。
++++Prefab拥有的特点:
--1、能够放到多个场景中。也能够在同一场景中放置多次;
--2、当加入一个Prefab到场景中,就创建了它的一个实例;
--3、所有的Prefab实例链接到原始Prefab,本质上是原始Prefab的克隆;(运行中生成的对象会有(Clone)的标记)
--4、只要Prefabs原型发生改变,所有的Prefabs实例都会产生变化。
###4D.02.19、请描述一下Unity中position,localPosition以及anchoredPosition之间的区别? |
++4D.02.19、请描述一下Unity中position,localPosition以及anchoredPosition之间的区别?
++++立钻哥哥:
++++1、【Position】:是根据世界原点为中心;(是世界坐标中的位置,可以理解为绝对坐标)
++++2、【localPositio】:是根据父节点为中心;(如果没有父节点,localpositon和position是没有区别的)(相对于父对象的位置,是相对坐标。)
++++3、【anchoredPosition】:可以理解为Pivot点相对于Anchor reference点的位置;(锚点到Pivot的位置)
###4D.02.20、Use coroutine to move a 2d game object from position(10, 5) to position (20, -5) within 2 seconds? |
++4D.02.20、Use coroutine to move a 2d game object from position(10, 5) to position (20, -5) within 2 seconds?
--(1)so that the path follows a straight line like this.
--(2)so that the path follows a Sine(正弦) curve with the amplitude(振幅)
++++立钻哥哥:
##4D.03、Unity第三次模拟面试 |
++++4D.03.01、什么是协同程序(协程)? 协同程序与线程的区别是哪些?
++++4D.03.02、请简述GC(垃圾回收)产生的原因,并描述如何避免?
++++4D.03.03、在物体发生碰撞的整个过程中,有几个阶段,分别列出对应的函数?
++++4D.03.04、Unity3d脚本从唤醒到销毁有着一套比较完整的生命周期,请列出系统自带的几个重要的方法。 物理更新一般放在哪个系统函数里? 为什么?
++++4D.03.05、请描述游戏动画有哪几种,以及其原理?
++++4D.03.06、LOD是什么,优缺点是什么?
++++4D.03.07、简述矩阵相乘的意义及注意点?
++++4D.03.08、什么是LightMap?
++++4D.03.09、Heap与Stack有何区别?
++++4D.03.10、值类型和引用类型有何区别?
++++4D.03.11、请列举一些Unity3d在移动设备上的一些优化资源的方法?
++++4D.03.12、请简述水面倒影的渲染原理?
++++4D.03.13、简单描述Prefab的用处和环境?
++++4D.03.14、简单描述AssetBundle的作用?
++++4D.03.15、解释一下vertex shader和pixel shader?
++++4D.03.16、通过脚本来删除一个GameObject?
++++4D.03.17、Unity3d脚本从唤醒到销毁有着一套比较完整的生命周期,请列出系统自带的几个重要的方法?
++++4D.03.18、如何计算Vector3的长度?
++++4D.03.19、Vector3.normalize有什么意思,如何计算这个值?
++++4D.03.20、补全下面代码的Update函数,让这个GameObject以speed的速度向target移动,当与target的距离小于等于1的时候停止?
++++4D.03.21、Application.dataPath、Application.streamingAssetsPath、Application.persistentDataPath存储路径在IOS平台下,分别对应的位置是什么?
++++4D.03.22、不使用foreach如何遍历一个Dictionary?
++++4D.03.23、Animator的状态机有哪些类型的参数?
++++4D.03.24、如何控制多个相机的显示顺序?
++++4D.03.25、如何执行一个协程,如何停止一个协程?
++++4D.03.26、指出下面代码的错误?
###4D.03.01、什么是协同程序(协程)? 协同程序与线程的区别是哪些? |
++4D.03.01、什么是协同程序(协程)? 协同程序与线程的区别是哪些?
++++立钻哥哥:协程称为协同程序,即在主线程运行的同时开启另一段逻辑,来协助当前程序的执行,StartCoroutine()是开启协程,StopCoroutine()是关闭协程,协程的返回值是IEnumerator类型,而在协程内部必须有yield return **。
++++协程,线程的区别:
--1、线程拥有自己独立的栈和共享的堆,共享堆,不共享栈,线程由操作系统调度;
--2、协程和线程一样共享堆,不共享栈,协程由程序员在协程的代码里显示调度;
--3、协程避免了无意义的调度,由此可以提高性能,程序员必须自己承担调度的责任,协程也失去了标准线程使用多CPU的能力。
++++补充1:多线程程序同时运行多个线程,出主线程之外的线程无法访问Unity3D的对象、组件、方法,而在任一指定时刻只有一个协程在运行。
++++补充2:协程中断指令:
--中断指令(yield):一个协程收到中断指令后暂停执行,返回上层执行同时等待这个指令达成后继续执行;
--WaitForSeconds:等待指定秒数:yield return new WaitForSeconds(2);
--WaitForFixedUpdate:等待一个固定帧:yield return new WaitForFixedUpdate();
--WaitForEndOfFrame:等待帧结束:yield return new WaitForEndOfFrame();
--StartCoroutine:等待一个新协程暂停:yield return StartCoroutine(otherCoroutine);
--WWW:等待一个加载完成:yield return www;
###4D.03.02、请简述GC(垃圾回收)产生的原因,并描述如何避免? |
++4D.03.02、请简述GC(垃圾回收)产生的原因,并描述如何避免?
++++立钻哥哥:当用new创建一个对象时,当可分配的内存不足时,GC就会去回收未使用的对象,GC的操作是非常复杂的,会占用很多CPU时间,对于移动设备来说频繁的垃圾回收会严重影响性能。
++++建议可以避免GC频繁操作:
--1、减少用new创建对象的次数,在创建对象时会产生内存碎片,这样会造成内存无法使用;
--2、使用共用的对象(静态成员,常量),但是静态成员和常量的生命周期是整个应用程序;
--3、在拼接大量字符串时使用StringBuilder,创建StringBuilder对象时要设置StringBuilder的初始大小:StringBuilder myBuf = new StringBuilder(size);
--4、使用Object Pool(对象池)技术;
###4D.03.03、在物体发生碰撞的整个过程中,有几个阶段,分别列出对应的函数? |
++4D.03.03、在物体发生碰撞的整个过程中,有几个阶段,分别列出对应的函数?
++++立钻哥哥:物体发生碰撞主要有3个阶段:Enter、Stay、Exit;
++++1、Collider.OnCollisionEnter():进入碰撞;
++++2、Collider.OnCollisionStay():逗留碰撞;
++++3、Collider.OnCollisionExit():退出碰撞;
###4D.03.04、Unity3d脚本从唤醒到销毁有着一套比较完整的生命周期,请列出系统自带的几个重要的方法。 物理更新一般放在哪个系统函数里? 为什么? |
++4D.03.04、Unity3d脚本从唤醒到销毁有着一套比较完整的生命周期,请列出系统自带的几个重要的方法。 物理更新一般放在哪个系统函数里? 为什么?
++++立钻哥哥:【Awake()】=>【OnEnable()】=>【Start()】=>【FixedUpdate()】=>【Update()】=>【LateUpdate()】=>【OnBecameVisible()】=>【OnGUI()】=>【OnBecameInvisible()】=>【OnDisable()】=>【OnDestroy()】=>【OnApplicationQuit()】
++++FixedUpdate():固定帧被调用;因为不受到计算机帧频的影响,所以比较适合于做物理方面的更新;比如控制一个Rigidbody,因为物理世界不应该被帧率影响;
++++FixedUpdate(),是在固定的时间间隔执行,不受游戏帧率的影响。(时间间隔可以设置:Edit->ProjectSetting->time:设置项Fixedtimestep)
###4D.03.05、请描述游戏动画有哪几种,以及其原理? |
++4D.03.05、请描述游戏动画有哪几种,以及其原理?
++++立钻哥哥:游戏动画主要分:关节动画、骨骼动画、单一网格模型动画(关键帧动画);
++++【1、关节动画】:把角色分成若干独立部分,一个部分对应一个网格模型,部分的动画连接成一个整体的动画,角色比较灵活,Quake2中使用这种动画;
++++【2、单一网格模型动画】:由一个完整的网格模型构成,在动画序列的关键帧里记录各个顶点的原位置及其该变量,然后插值运算实现动画效果,角色动画较真实;
++++【3、骨骼动画】:广泛应用的动画方式,集成了以上两个方式的优点,骨骼按角色特点组成一定的层次结构,有关节相连,可做相对运动,皮肤作为单一网格蒙在骨骼之外,决定角色的外观,皮肤网格每一个顶点都会受到骨骼的影响,从而实现完美的动画。
###4D.03.06、LOD是什么,优缺点是什么? |
++4D.03.06、LOD是什么,优缺点是什么?
++++立钻哥哥:LOD是Level of detail简称,意为多层次细节,是最常用的游戏优化技术。
++++LOD技术指根据物体模型的几点在显示环境中所处的位置和重要性,决定物体渲染的资源分配,降低非重要物体的面数和细节度,从而获得高效率的渲染运算。
++++LOD优点:可根据距离动态的选择渲染不同细节的模型;
++++LOD缺点:增加美工工作量,增大了游戏的容量。
###4D.03.07、简述矩阵相乘的意义及注意点? |
++4D.03.07、简述矩阵相乘的意义及注意点?
++++立钻哥哥:矩阵相乘表示线性变换:平移、旋转、缩放、投影、仿射等;
++++矩阵相乘的注意点:矩阵的蠕变:误差的积累;
###4D.03.08、什么是LightMap? |
++4D.03.08、什么是LightMap?
++++立钻哥哥:LightMap是一张贴图,存储了从场景中直接烘培而来的灯光信息,通过这种贴图,我们可以减少DrawCall,提升我们游戏的性能。(LightMap通常没有阴影,用空间换时间来加快渲染速度。)
++++补充1:LightMap称为光照贴图:把灯光和物体设置成静态,然后对灯光进行烘培,此时在物体表面形成一张有灯光效果的贴图。(把场景中的灯光删除掉,物体表面依赖有灯光的效果,这种效果是灯光贴图造成的。)
++++补充2:LightMap光照贴图的优点:避免动态光照在场景中的实时渲染,减少DrawCall。
++++补充3:【Windows->Lightmapping】:可以打开Unity编辑器的Lightmapping视图。
###4D.03.09、Heap与Stack有何区别? |
++4D.03.09、Heap与Stack有何区别?
++++立钻哥哥:stack栈空间有限,heap堆的空间是很大的自由区。
++++【heap堆】:存储引用类型,比如:类,接口,数组等;(heap堆的空间是手动申请和释放的,常用new关键字来分配)
++++【stack栈】:存储值类型,即存储固定长度的数据,比如:整数、字符、结构、布尔、枚举等。(stack栈的空间由操作系统自动分配和释放)
###4D.03.10、值类型和引用类型有何区别? |
++4D.03.10、值类型和引用类型有何区别?
++++立钻哥哥:1、值类型继承自System.ValueType,引用类型继承自System.Object;
++++2、值类型存储在内存栈中;引用类型数据存储在内存堆中,而内存单元中存放的是堆中存放的地址;
++++3、值类型存取快;引用类型存取快;
++++4、值类型表示实际数据;引用类型表示指向存储在内存堆中的数据的指针和引用;
++++5、栈的内存是自动释放的;堆内存在.Net中会由GC自动释放;
###4D.03.11、请列举一些Unity3d在移动设备上的一些优化资源的方法? |
++4D.03.11、请列举一些Unity3d在移动设备上的一些优化资源的方法?
++++立钻哥哥:1、使用AssetBundle,实现资源分离和共享,将内存控制到200M之内,同时也可以实现资源的在线更新;
++++2、顶点数对渲染无论是CPU还是GPU都是压力最大的,降低顶点数到8万以下,FPS稳定在30帧左右;
++++3、只使用一盏动态灯,不使用阴影,不使用光照探头;
++++4、粒子系统是CPU上的大头:
--4.1、剪裁粒子系统;
--4.2、合并同时出现的粒子系统;
--4.3、自己实现轻量级的粒子系统;
++++5、Animator也是一个效率奇差的地方:
--5.1、把不需要跟骨骼动画和动作过渡的地方全部使用Animation,控制骨骼数量在30根以下;
--5.2、Animator出视野不更新;
--5.3、删除无意义的animator;
--5.4、Animator的初始化很耗时;
--5.5、除主角外都不要跟骨骼运动(Apply root motion);
--5.6、绝对禁止掉那些不带刚体带包围盒的物体(static collider)运动;
++++6、不要每帧计算ViewSize和WindowSize;
++++7、给美术定一个严格的经过科学验证的美术标准,并在U3D里面配以相应的检测工具;
###4D.03.12、请简述水面倒影的渲染原理? |
++4D.03.12、请简述水面倒影的渲染原理?
++++立钻哥哥:1、第一个思路:在物体上(非水面对象亦可)添加shader,这个shader有两个Pass通道:一个正常渲染;一个渲染倒影(反过来再做扭曲);
++++2、第二个思路:在水面对象上加Shader,这个Shader有两个作用:一是对原有水面的像素进行扰动;二是对环境中的物体进行图像采集,然后融合到水面纹理当中;
++++水面倒影的渲染原理:对水面的贴图纹理进行扰动,以产生波光粼粼的效果。(用Shader可以通过GPU在像素级别做扰动,效果细腻,需要的顶点少,速度快。)
###4D.03.13、简单描述Prefab的用处和环境? |
++4D.03.13、简单描述Prefab的用处和环境?
++++立钻哥哥:Prefab是预制体,一般当游戏中需要频繁创建一个物体时,使用预制体可以节省内存,方便创建,方便对游戏物体进行操作,方便对属性进行修改。
++++补充1:Prefab资源可以在项目中多次重复使用;由Prefab实例出的GameObject,其在Hierarchy视图中表现为蓝色;Prefab上的组件信息一经改变,其实例出的GameObject也会自动改变;
++++补充2:Prefab是一种资源类型:存储在项目视图中的一种可反复使用的游戏对象;因而当游戏中须要非常多反复使用的对象、资源等时,就可以用Prefab了。
++++Prefab拥有的特点:
--1、能够放到多个场景中,也能够在同一场景中放置多次;
--2、当加入一个Prefab到场景中,就创建了它的一个实例;
--3、所有的Prefab实例链接到原始Prefab,本质上是原始Prefab的克隆;(运行中生成的对象会有(Clone)的标记)
--4、只要Prefabs原型发生改变,所有的Prefabs实例都会产生变化。
###4D.03.14、简单描述AssetBundle的作用? |
++4D.03.14、简单描述AssetBundle的作用?
++++立钻哥哥:AssetBundle是Unity引擎提供的一种资源压缩文件,文件扩展名通常为Unity3d或assetbundle。
++++AssetBundle的用途:1、更新资源;2、压缩资源,减少所占空间;
###4D.03.15、解释一下vertex shader和pixel shader? |
++4D.03.15、解释一下vertex shader和pixel shader?
++++立钻哥哥:vertex shader:顶点处理/多边形处理;pixel shader:处理像素单位的阴影和处理相关纹理;
++++【Vertex Shader】:顶点渲染单元:负责生成3D图像的骨架,三角形的每个顶点信息都是由它计算完成。(相对像素渲染,顶点渲染的工作量要轻得多,但它承担了3D运算的基础工作,对GPU的最终效能有着决定性的影响)
++++【Pixel Shader】:像素渲染:是3D处理中最关键的工作,大家在游戏中看到的大量水面波纹、反光、凹凸质感、旗帜飘扬之类的特效都是由它处理,任务量最为繁重、对性能的影响也最大。(无论是NVIDIA还是ATI,总是在像素单元的硬件设计及数学算法上精益求精,力求提高处理效率。)(OpenGL中Pixel Shader也叫做Fragment(片元) Shader)
###4D.03.16、通过脚本来删除一个GameObject? |
++4D.03.16、通过脚本来删除一个GameObject?
++++立钻哥哥:Destroy(myObj);
++++public static void Destroy(Object obj, float t = 0.0f);
++++补充1:Unity中提供了销毁对象的三种方式:
--1.1、Destroy();
----static void Destroy(Object obj, float t = 0.0F);
----删除一个游戏物体或组件等。
----如果Object实际上为组件,则将其从gameObject中删除并销毁;
----如果实际上gameObject则将销毁它的全部组件及其所有子物体;
--1.2、DestroyImmediate();
----static void DestroyImmediate(Object obj, bool allowDestroyingAsset = false);
----该函数会将资源永久销毁。
--1.3、DontDestroyOnLoad();
----static void DontDestroyOnLoad(Object target);
----作用是在加载新场景的时候使目标物体不被自动销毁;
----如果物体时一个组件或游戏对象,则所有的Transform层次都不会被销毁,全部保留下来;
--提示:Object中的静态函数在程序中调用的时候,可以直接调用,不用写类名。
###4D.03.17、Unity3d脚本从唤醒到销毁有着一套比较完整的生命周期,请列出系统自带的几个重要的方法? |
++4D.03.17、Unity3d脚本从唤醒到销毁有着一套比较完整的生命周期,请列出系统自带的几个重要的方法?
++++立钻哥哥:【Awake()】=>【OnEnable()】=>【Start()】
=>【FixedUpdate()】=>【Update()】=>【LateUpdate()】
=>【OnBecameVisible()】=>【OnGUI()】=>【OnBecameInvisible()】
=>【OnDisable()】=>【OnDestroy()】=>【OnApplicationQuit()】
###4D.03.18、如何计算Vector3的长度? |
++4D.03.18、如何计算Vector3的长度?
++++立钻哥哥:Vector3.magnitude(float magnitude):返回向量的长度(只读)。
++++magnitude:向量的长度是(x*x + y*y + z*z)的平方根;
++++如果需要比较一些向量的长度,可以比较它们的长度的平方:使用sqrMagnitude(就是平方很快,因为计算机求开发比较消耗内存和时间。)
###4D.03.19、Vector3.Normalize有什么意思,如何计算这个值? |
++4D.03.19、Vector3.Normalize有什么意思,如何计算这个值?
++++立钻哥哥:归一化:public static Vector3 Noramlize(Vector3 value); :返回一个向量,其方向与指定向量相同,但长度为1。(System.Numerics.Vectors)
++++Vector3.Normalize的特点是:改变当前的向量,也就是当前向量长度是1;
--Vector3.Normalize():Makes this vector hava a magnitude of 1.
++++Vector3.normalized的特点是:当前向量是不改变的并且返回一个新的规范化的向量;
--Vector3.normalized:Returns this vector with a magnitude of 1(Read Only).
++++归一化就是要把需要处理的数据经过处理后(通过某种算法)限制在需要的一定范围内;
###4D.03.20、补全下面代码的Update函数,让这个GameObject以speed的速度向target移动,当与target的距离小于等于1的时候停止? |
++4D.03.20、补全下面代码的Update函数,让这个GameObject以speed的速度向target移动,当与target的距离小于等于1的时候停止?
class Mover : MonoBehaviour{ Vector3 target; float speed;
void Update(){ } } |
++++立钻哥哥:
++++思路1、transform.Translate()
--function Translate(translation : Vector3, relativeTo : Space = Space.Self) : void;
--物体以relativeTo为参考系,沿着translation运动。如果relativeTo缺省将以Space.Self为默认值;
--transform.Translate(Vector3.forward * ShootSpeed * Time.deltaTime, Fighter.transform); :导弹相对于战斗机Fighter以ShootSpeed的速度向前运动,Vector3.forward在此时表示导弹的正前方;
++++思路2:指定速度velocity:
--这种方法只能适用于刚体,因为velocity是刚体特有的属性。
--gameObject.GetComponent<Rigidbody>().velocity = Vector3.forward * MoveSpeed;
++++思路3:使用rigidbody.MovePosition();
--public void MovePosition(Vector3 position); :让物体移动到新位置position;
--rb.MovePosition(transform.position + transform.forward * Time.deltaTime); :让物体向前运动Time.deltaTime距离
++++思路4:Vector3.MoveTowards():
--static function MoveTowards(current:Vector3, target:Vector3, maxDistanceDelta:float) : Vector3;
--target = new Vector3(20, transform.position.y, 20);
--transform.position = Vector3.MoveTowards(transform.position, target, MoveSpeed*Time.deltaTime);
++++思路5.1:Mathf.Lerp():
--static function Lerp(from:float, to:float, t:float) : float;
--Mathf.Lerp()是对数字进行插值。
--调用Lerp函数会返回from与to之间的插值(from+to)*t,t在0~1之间;
--Vector3 Target = new Vector3(20, 20, 20);
--gameObject.transform.localPosition = new Vector3(
Mathf.Lerp(transform.position.x, Target.x, MoveSpeed*Time.deltaTime),
Mathf.Lerp(transform.position.y, Target.y, MoveSpeed*Time.delatTime),
Mathf.Lerp(transform.position.z, Target.z, MoveSpeed*Time.deltaTime)
);
++++思路5.2、Vector3.Lerp()
--public static Vector3 Lerp(Vector3 a, Vector3 b, float t);
--Vector3.Lerp()是对三维向量进行插值。
--Vector3 Target = new Vector3(20, 20, 20);
--gameObject.transform.localPosition = Vector3.Lerp(transform.position, Target, MoveSpeed*Time.deltaTime);
###4D.03.21、Application.dataPath、Application.streamingAssetsPath、Application.persistentDataPath存储路径在IOS平台下,分别对应的位置是什么? |
++4D.03.21、Application.dataPath、Application.streamingAssetsPath、Application.persistentDataPath存储路径在IOS平台下,分别对应的位置是什么?
++++立钻哥哥:
++++【Application.dataPath】:用于返回程序的数据文件所在文件夹的路径;
++++【Application.streamingAssetsPath】:用于返回流数据的缓存目录,返回路径为相对路径,适合设置一些外部数据文件的路径;
++++【Application.persistentDataPath】:用于返回一个持久化数据存储目录的路径,可以在此路径下存储一些持久化的数据文件;
++++【Application.temporaryCachePath】:用于返回一个临时数据的缓存目录。
++++【1、Android平台】:
--[Application.dataPath]: /data/app/xxx.apk
--[Application.streamingAssetsPath]: jar:file:///data/app/xxx.apk/!/assets
--[Application.persistentDataPath]: /data/data/xxx/files
--[Application.temporaryCachePath]: /data/data/xxx/cache
++++【2、IOS平台】:
--[Application.dataPath]: Application/xxx/xxx.app/Data
--[Application.streamingAssetspath]: Application/xxx/xxx.app/Data/Raw
--[Application.persistentDataPath]: Application/xxx/Documents
--[Application.temporaryCachePath]: Application/xxx/Library/Caches
++++【3、Unity Editor平台】:
--[Application.dataPath]: Application(工程目录)/Assets
--[Application.streamingAssetsPath]: Application(工程目录)/Assets/StreamingAssets
--[Application.persistentDataPath]: 系统指定目录1/工程名
--[Application.temporaryCachePath]: 系统指定目录2/工程名
++++补充1:Debug.Log(“dataPath: ”+ Application.dataPath);
++++补充2:Debug.Log(“persistentDataPath: ” + Application.persistentDataPath);
++++补充3:Debug.Log(“streamingAssetsPath: ” + Application.streamingAssetsPath);
++++补充4:Debug.Log(“temporaryCachePath: ” + Application.temporaryCachePath);
###4D.03.22、不使用foreach如何遍历一个Dictionary? |
++4D.03.22、不使用foreach如何遍历一个Dictionary?
++++立钻哥哥:遍历字典:Dictionary<string, int> dic = new Dictionary<string, int>();
for(int i = 1; i <= dic.Count; i++){
}
###4D.03.23、Animator的状态机有哪些类型的参数? |
++4D.03.23、Animator的状态机有哪些类型的参数?
++++立钻哥哥:Animator状态机参数类型:int、bool、float、trigger;
###4D.03.24、如何控制多个相机的显示顺序? |
++4D.03.24、如何控制多个相机的显示顺序?
++++立钻哥哥:调整相机的深度(Depth);
###4D.03.25、如何执行一个协程,如何停止一个协程? |
++4D.03.25、如何执行一个协程,如何停止一个协程?
++++立钻哥哥:StartCoroutine():开启协程;
++++StopCoroutine():关闭协程;
###4D.03.26、指出下面代码的错误? |
++4D.03.26、指出下面代码的错误?
using UnityEngine; using System.Collections;
public class TEST : MonoBehaviour{ void Start(){ transform.position.x = 10; } } |
++++立钻哥哥:无法修改“Transform.position”的返回值,因为它不是变量;
##4D.04、Unity第四次模拟面试 |
++4D.04、Unity第四次模拟面试
++++4D.04.01、Prefab的作用,如何获取Prefab实例化出来的GameObject的预置类型,PrefabInstance,ModelPrefabInstance等预置类型有什么不同?
++++4D.04.02、资源如何通过AssetBundle打包和加载?
++++4D.04.03、AssetDatabase.LoadAssetAtPath和Resource.Load分别适用于什么场合?
++++4D.04.04、正交摄像机和透视摄像机的区别,第一人称摄像机Fov变化会产生怎样的摄像机效果?
++++4D.04.05、RigidBody的用途,Kinematic的RigidBody和普通RigidBody的区别?
++++4D.04.06、如何计算RigidBody间反弹的弹力大小,该弹力大小和包围盒大小以及Mass之间的关系,并举例说明对场景进行破坏时如何给RigidBody施力或赋予冲量?
++++4D.04.07、披风等如何使用柔布系统实现?
++++4D.04.08、协程的用途,协程和线程有什么区别?
++++4D.04.09、yield关键字什么时候使用,yield break/yield return有什么区别?
++++4D.04.10、物体自身旋转使用的函数? 物体设定为某个姿态(旋转角度)的函数?
++++4D.04.11、获取、增加、删除组件的命令分别是什么?
++++4D.04.12、以下说法正确的是?
++++4D.04.13、程序输出结果为?
++++4D.04.14、以下程序的输出结果为?
++++4D.04.15、Unity程序中,有Controller.cs和NewScript.cs两个脚本,Controller.cs脚本挂载到MainCamera主摄像机下,程序是否能正常运行,有什么问题,该如何修改或优化?
++++4D.04.16、鼠标左键点击,主摄像头向鼠标点发射射线,判断射线是否碰到标签为“cube”的物体,打印物体的名称?
++++4D.04.17、数列1,1,2,3,5,8,13... 第n位数是多少,分别用递归和循环实现,比较两种算法的时间复杂度和空间复杂度,是否还能继续优化?
++++4D.04.18、已知arrayA和arrayB是已经排序好的数组,从大到小,现在要合并这两个数组内的数到一个数组,仍然要求是从大到小排序。请写出代码?
++++4D.04.19、用C#或别的语言写一段代码,计算一个桌子的体积。
++++4D.04.21、解释一下协同程序?
++++4D.04.22、如何避免切换场景时销毁一个GameObject?
++++4D.04.23、如何优化内存?
++++4D.04.24、简述怎样做UI的适配?
++++4D.04.25、Unity中如何调用JavaClass的方法?
++++4D.04.26、C#的委托是什么? 有何用处?
++++4D.04.27、简述四元数的作用,四元数对欧拉角的优点?
++++4D.04.28、描述一下C#的泛型?
++++4D.04.29、值类型和引用类型有何区别?
++++4D.04.30、按顺序列出几个主要的MonoBehaviour生命周期函数并解释下Update和FixedUpdate和LateUpdate的作用和区别?
++++4D.04.31、如何安全的在不同工程间安全地迁移Asset数据?
++++4D.04.32、MipMap是什么,作用?
++++4D.04.33、.Net与Mono的关系?
++++4D.04.34、ref参数和out参数是什么? 有什么区别?
++++4D.04.35、Unity和Android与iOS如何交互?
++++4D.04.36、(机试)用UGUI实现一个简单背包系统,尽你掌握的知识完善它?
++++4D.04.37、(机试)生成100以内的100个随机数,要求不重复?
++++4D.04.38、(机试)写出几种常用的排序算法?
++++4D.04.39、(机试)编写一个函数可以输出斐波那切数列任意位置的值?
###4D.04.01、Prefab的作用,如何获取Prefab实例化出来的GameObject的预置类型,PrefabInstance,ModelPrefabInstance等预置类型有什么不同? |
++4D.04.01、Prefab的作用,如何获取Prefab实例化出来的GameObject的预置类型,PrefabInstance,ModelPrefabInstance等预置类型有什么不同?
++++立钻哥哥:预制物体的类型,可通过EditorUtility.GetPrefabType()返回;(这是一个编辑器类,如果想使用需要把它放到工程目录下的Assets/Editor文件夹下,命名空间:using UnityEditor;)
++++【PrefabInstance】:物体是一个用户创建的预置的实例;
++++【ModelPrefabInstance】:物体是一个导入3D模型预置的实例;
###4D.04.02、资源如何通过AssetBundle打包和加载? |
++4D.04.02、资源如何通过AssetBundle打包和加载?
++++立钻哥哥:AssetBundle:通过bundle的形式,将资源打成Asset Bundle放在服务器或本地磁盘,然后使用WWW模块get下来,然后从这个bundle中Load某个Object;
++++AssetBundle是从Unity项目中打包出来的资源文件,可用于资源的更新等;(AssetBundle支持3种压缩格式:LZMA,LZ4,无压缩;(默认是LZMA格式:可以大大压缩资源,利于下载,但使用时要解压,加载时间过长)(不压缩:资源包会比较大,不需解压,加载快))
++++AssetBundle是Unity引擎提供的一种资源压缩文件,文件扩展名通常为unity3d或assetbundle;
++++第一步:资源设置:AssetBundle名称:AAAA.unity3d;BBBB.yanlz;CCCC.red;
++++第二步:Editor打包
[MenuItem(“Assets/Build AssetBundles”)] static void BuildAllAssetBundles(){ BuildPipeline.BuildAssetBundles(Application.dataPath + “/AssetBundles”, BuildAssetBundleOptions.None, BuildTarget.StandaloneOSXIntel); } //BuildPipleline.BuildAssetBundles():打包资源 //outputPath:资源打包的生成路径; //assetBundleOptions:AssetBundle打包设置; //targetPlatform:AssetBundle目标平台; |
++++第三步:AssetBundle资源使用:加载流程:【资源清单=>清单说明=>依赖文件=>目标文件】;
++++A、下载资源清单:
string cdn = “http://127.127.1.1”; //服务器地址
//额外的清单地址,清单文件名称与它所生产的文件名称一致 string url = cdn + “AssetBundles”;
WWW www = WWW.LoadFromCacheOrDownload(url, 1); //先下载清单 yield return www; //等待下载 |
+++B、下载清单说明Mainfest:
AssetBundle ab = www.assetBundle; //获取到清单
//找到清单所对应的说明文件Mainfest,字符串为AssetBundleMainfest,固定写法 AssetBundleMainfest mainfest = (AssetBundleMainfest).ab.LoadAsset(“AssetBundleMainfest”); ab.Unload(false); //暂不销毁资源 |
++++C、下载依赖资源:
string realName = “prefab.redcube”; //需要加载的资源(一个预设体) string[] dps = mainfest.GetAllDependencies(realName); //获取此资源的依赖关系 AssetBundle[] abs = new AssetBundle[dps.Length]; //创建依赖资源列表
//逐个下载放入列表 for(int i = 0; i > dps.Length; i++){ string dUrl = cdn + dps[i]; //服务器地址+依赖资源名称 WWW www = WWW.LoadFromCacheOrDownLoad(dUrl, mainfest.GetAssetBundleHash(dps[i])); //下载依赖资源 yield return www; //等待下载;
abs[i] = www.assetBundle; //导入列表 object[] o = abs[i].LoadAllAssets(); //获取所有资源(调试使用) Debug.Log((o[0] as Material).name); } |
++++D、下载目标资源:
//依赖资源下载完毕之后,下载主资源 WWW www = WWW.LoadFromCacheOrDownload(cdn + realName, mainfest.GetAssetBundleHash(realName)); yield return www; //等待下载
//异常处理 if(!string.IsNullOrEmpty(www.error)){ Debug.Log(www.error); }else{ AssetBundle ab = www.assetBundle; //获取资源 object[] oo = ab.LoadAllAssets(); //获取所有资源 GameObject gobj = oo[0] as GameObject; //获取预设体
if(gobj != null){ Instantiate(gobj); //加载到场景 } ab.Unload(false); //暂不销毁资源 }
//暂不销毁依赖资源,方便下面继续使用,如果不在需要可以销毁 foreach(AssetBundle ab in abs){ ab.Unload(false); //暂不销毁资源 } |
###4D.04.03、AssetDatabase.LoadAssetAtPath和Resource.Load分别适用于什么场合? |
++4D.04.03、AssetDatabase.LoadAssetAtPath和Resource.Load分别适用于什么场合?
++++立钻哥哥:Unity的资源管理模式:编辑器管理(使用AssetDatabase)和在运行时管理(使用Resources和AssetBundle);
++++在编辑器内加载卸载资源,并不能再游戏发布时使用,它只能在编辑器内使用。(AssetDatabase加载速度快,效率高,适合在测试时使用)
++++【AssetDatabase.LoadAssetAtPath()】:指定路径加载资源;
--static Object LoadAssetAtPath(string assetPath, Type type);
--返回在指定位置assetPath下第一个类型是type的资源对象;
using UnityEditor;
#if UNITY_EDITOR
Texture2D image = AssetDatabase.LoadAssetAtPath(“Assets/Images/1.jpg”, typeof(Texture2D)) as Texture2D; Material mat = AssetDatabase.LoadAssetAtPath(“Assets/Materials/New Material.mat”, typeof(Material)) as Material; //指定路径 Material mat = AssetDatabase.LoadAssetAtPath<Material>(“Assets/red.mat”); //指定资源名
#endif
Resources.UnloadAsset(mat); //不使用时卸载资源(否则内存会越来越高) |
++++【Resources.Load()】:加载资源;
--public static Object Load(string path, Type systemTypeInstance);
--使用这种方式加载资源,首先需要在Asset目录下创建一个名为Resources的文件夹,然后把资源文件放进去,也可以在Resources中再创建子文件夹,代码加载时添加相应的路径;
GameObject go = Resources.Load<GameObject>(“test/Cube”); //加载prefab Instantiate(go); //实例化这个gameObject
render.material.mainTexture = Resources.Load(“glass”) as Texture; Object objMat = Resources.Load(“Materials/cube”, typeof(Material)); Object objGo = Resources.Load(“Prefabs/cube”, typeof(GameObject)); Object cubePreb = Resources.Load(cubePath, typeof(GameObject)); GameObject[] arr = Resources.LoadAll<GameObject>(“Prefabs”); |
###4D.04.04、正交摄像机和透视摄像机的区别,第一人称摄像机Fov变化会产生怎样的摄像机效果? |
++4D.04.04、正交摄像机和透视摄像机的区别,第一人称摄像机Fov变化会产生怎样的摄像机效果?
++++立钻哥哥:Fov(Field of View):表示视场;(这是在摄像机中能够看到的那部分场景)
++++【透视摄像机(Perspective)】:这种摄像机的效果更贴近真实世界。(有近大远小效果)
++++【正交摄像机(Orthographic)】:对象相对于摄像机的距离对渲染的结果没有影响。
++++视角Fov:镜头能覆盖的范围,第一人称摄像机Fov变化后视野会随着数值变大而变宽;
###4D.04.05、RigidBody的用途,Kinematic的RigidBody和普通RigidBody的区别? |
++4D.04.05、RigidBody的用途,Kinematic的RigidBody和普通RigidBody的区别?
++++立钻哥哥:isKinematic属性是确定刚体是否接受动力学模拟,此影响不仅包括重力感应,还包括速度、阻力、质量等物理模拟;(打开后物体不受物理引擎影响,只受transform的控制。)
++++Rigidbody.isKinematic:是否动力学;(public bool isKinematic;):控制物体是否能够影响这个刚体;(如果isKinematic启用,力、碰撞或关节不会影响这个刚体。刚体将通过动画或脚本完全控制改变transform.position。)
++++动力学刚体也被用于制作角色,通常是由动画驱动,但是在某些事件可以通过设置isKinematic为false,快速转化为一个布娃娃;
++++kinematic常用来创造ragdoll,由于kinematic可以方便的开关,通常情况下开启kinematic方便角色移动等,但遇到碰撞,爆炸冲击等情况,可以在脚本里添加代码使其关闭kinematic变为普通的rigidbody接受物理作用:
using UnityEngine; using System.Collections;
public class MyRagdollClass : MonoBehaviour{ public Rigidbody rb;
void Start(){ rb = GetComponent<Rigidbody>(); }
void EnableRagdoll(){ rb.isKinematic = false; rb.detectCollisions = true; }
void DisableRagdoll(){ rb.isKinematic = true; rb.detectCollisions = false; }
} //立钻哥哥:public class MyRagdollClass:MonoBehaviour{} //拓展:如果制作一个上升的平台,本身是Rigidbody,且不受物理引擎影响,打开isKinematic=true; |
###4D.04.06、如何计算RigidBody间反弹的弹力大小,该弹力大小和包围盒大小以及Mass之间的关系,并举例说明对场景进行破坏时如何给RigidBody施力或赋予冲量? |
++立钻哥哥推荐的拓展学习链接(Link_Url):
++++立钻哥哥Unity 学习空间: http://blog.csdn.net/VRunSoftYanlz/
++++Unity面试题ABC:https://blog.csdn.net/vrunsoftyanlz/article/details/78630687
++++Unity面试题DEF:https://blog.csdn.net/VRunSoftYanlz/article/details/78630838
++++Unity知识点0001:https://blog.csdn.net/vrunsoftyanlz/article/details/80302012
++++Unity知识点0008:https://blog.csdn.net/VRunSoftYanlz/article/details/81153606
++++Unity引擎基础:https://blog.csdn.net/vrunsoftyanlz/article/details/78881685
++++Unity面向组件开发:https://blog.csdn.net/vrunsoftyanlz/article/details/78881752
++++Unity物理系统:https://blog.csdn.net/vrunsoftyanlz/article/details/78881879
++++Unity2D平台开发:https://blog.csdn.net/vrunsoftyanlz/article/details/78882034
++++UGUI基础:https://blog.csdn.net/vrunsoftyanlz/article/details/78884693
++++UGUI进阶:https://blog.csdn.net/vrunsoftyanlz/article/details/78884882
++++UGUI综合:https://blog.csdn.net/vrunsoftyanlz/article/details/78885013
++++Unity动画系统基础:https://blog.csdn.net/vrunsoftyanlz/article/details/78886068
++++Unity动画系统进阶:https://blog.csdn.net/vrunsoftyanlz/article/details/78886198
++++Navigation导航系统:https://blog.csdn.net/vrunsoftyanlz/article/details/78886281
++++Unity特效渲染:https://blog.csdn.net/vrunsoftyanlz/article/details/78886403
++++Unity数据存储:https://blog.csdn.net/vrunsoftyanlz/article/details/79251273
++++Unity中Sqlite数据库:https://blog.csdn.net/vrunsoftyanlz/article/details/79254162
++++WWW类和协程:https://blog.csdn.net/vrunsoftyanlz/article/details/79254559
++++Unity网络:https://blog.csdn.net/vrunsoftyanlz/article/details/79254902
++++C#事件:https://blog.csdn.net/vrunsoftyanlz/article/details/78631267
++++C#委托:https://blog.csdn.net/vrunsoftyanlz/article/details/78631183
++++C#集合:https://blog.csdn.net/vrunsoftyanlz/article/details/78631175
++++C#泛型:https://blog.csdn.net/vrunsoftyanlz/article/details/78631141
++++C#接口:https://blog.csdn.net/vrunsoftyanlz/article/details/78631122
++++C#静态类:https://blog.csdn.net/vrunsoftyanlz/article/details/78630979
++++C#中System.String类:https://blog.csdn.net/vrunsoftyanlz/article/details/78630945
++++C#数据类型:https://blog.csdn.net/vrunsoftyanlz/article/details/78630913
++++Unity3D默认的快捷键:https://blog.csdn.net/vrunsoftyanlz/article/details/78630838
++++游戏相关缩写:https://blog.csdn.net/vrunsoftyanlz/article/details/78630687
++++设计模式简单整理:https://blog.csdn.net/vrunsoftyanlz/article/details/79839641
++++U3D小项目参考:https://blog.csdn.net/vrunsoftyanlz/article/details/80141811
++++UML类图:https://blog.csdn.net/vrunsoftyanlz/article/details/80289461
++++U3D_Shader编程(第一篇:快速入门篇):https://blog.csdn.net/vrunsoftyanlz/article/details/80372071
++++U3D_Shader编程(第二篇:基础夯实篇):https://blog.csdn.net/vrunsoftyanlz/article/details/80372628
++++框架知识点:https://blog.csdn.net/VRunSoftYanlz/article/details/80862879
++++游戏框架(UI框架夯实篇):https://blog.csdn.net/vrunsoftyanlz/article/details/80781140
++++游戏框架(初探篇):https://blog.csdn.net/VRunSoftYanlz/article/details/80630325
++++Lua快速入门篇(基础概述):https://blog.csdn.net/VRunSoftYanlz/article/details/81041359
++++Lua快速入门篇(XLua教程):https://blog.csdn.net/VRunSoftYanlz/article/details/81141502
++++Lua快速入门篇(Xlua拓展):https://blog.csdn.net/VRunSoftYanlz/article/details/81173818
++++立钻哥哥Unity 学习空间: http://blog.csdn.net/VRunSoftYanlz/
--_--VRunSoft:lovezuanzuan--_--