《Unity面试题》 |
版本程序员 |
做者面试 |
参与者算法 |
完成日期数据库 |
备注编程 |
Unity_JobView_V01_1.0设计模式 |
严立钻数组 |
|
2018.07.26缓存 |
|
|
|
|
|
|
#Unity面试题ABC:http://www.javashuo.com/article/p-mwacxwca-gm.html安全 #Unity面试题DEF:http://www.javashuo.com/article/p-wuwcrclr-s.html服务器
|
##《Unity面试题》发布说明:
++++“Unity面试题”是对在Unity职位面试中相关技术点的总结,立钻哥哥按照一个简单的章节分类进行整理。
++++固然,这些技术点有些是Unity经常使用的技术点,有些是各类面试题筛选整理,也有些是对Unity面试点的推断拓展。
++++“Unity面试题”将打形成Unity技术宝库,不可是面试的重要参考资料,也是对Unity知识点的汇总。
++++“Unity面试题”将采用简单概述,不拓展,将每一个技术点限定在简短篇幅中。
++++Unity面试题ABC:http://www.javashuo.com/article/p-mwacxwca-gm.html
++++Unity面试题D:http://www.javashuo.com/article/p-wuwcrclr-s.html
++++Unity面试题E:http://www.javashuo.com/article/p-hmabbtmc-ba.html
++++Unity面试题F:http://www.javashuo.com/article/p-olslkfao-cq.html
##《Unity面试题》目录:
#第一篇:Unity经典面试题
#第二篇:C#问题
#第三篇:Unity问题
#第四篇:Unity模拟面试
#第五篇:Unity面试进阶
#第六篇:立钻哥哥带您高薪就业
#第四篇:Unity模拟面试 |
##4D.0一、Unity第一次模拟面试 |
++4D.0一、Unity第一次模拟面试
++++4D.01.0一、哪一种实时光源是Unity中没有的?
++++4D.01.0二、如何在Unity中建立地形系统?
++++4D.01.0三、如下哪一种操做步骤能够在场景中添加“Wind Zone”?
++++4D.01.0四、在Unity编辑器中建立一个Directional Light,如下步骤正确的是?
++++4D.01.0五、下列哪一项不属于Camera中的“Clear Flags”?
++++4D.01.0六、如下哪一种脚本语言是Unity编辑器所不支持的?
++++4D.01.0七、对于Prefab,如下说法错误的是?
++++4D.01.0八、下面哪一种作法能够打开Unity的Asset Store?
++++4D.01.0九、在哪一个面板中能够修改物体的空间属性,如位置、朝向、大小等?
++++4D.01.十、如何为一个Asset资源设定一个Label,从而可以方便准确的搜索到?
++++4D.01.十一、Mecanim系统中,Body Mask的做用是?
++++4D.01.十二、如下哪一种操做步骤能够打开Unity编辑器的Lightmapping视图?
++++4D.01.1三、下列关于光照贴图,说法错误的是?
++++4D.01.1四、如何为物体添加光照贴图所使用的UV?
++++4D.01.1五、在哪一个模块下能够修改Render Path?
++++4D.01.1六、如下哪项技术不是目前Unity所支持的Occlusion Culling技术?
++++4D.01.1七、关于Vector3的API,如下说法正确的是?
++++4D.01.1八、如下哪一个函数在游戏进入新场景后会被立刻调用?
++++4D.01.1九、什么是导航网格(NavMesh)?
++++4D.01.20、下列哪些选项不是网格层属性的固有选项?
++++4D.01.2一、在场景中放置多个Camera并同时处于活动状态使会发生什么?
++++4D.01.2二、请简述Prefab的做用,并描述如何在移动设备的环境下恰当的使用它?
++++4D.01.2三、如何销毁一个UnityEngine.Object及其子类?
++++4D.01.2四、请简述为何Unity3D中会发生在组件上出现数据丢失的状况(missing)?
++++4D.01.2五、请简述Unity3D下如何安全的在不一样工程间迁移Asset数据,请举出三种方式?
###4D.01.0一、哪一种实时光源是Unity中没有的? |
++4D.01.0一、哪一种实时光源是Unity中没有的?
++++立钻哥哥:B
++++A、点光源;
++++B、方向光;
++++C、聚光灯;
++++D、日光灯;
###4D.01.0二、如何在Unity中建立地形系统? |
++4D.01.0二、如何在Unity中建立地形系统?
++++立钻哥哥:A
++++A、Terrain -> Create Terrain;
++++B、Component -> Create Terrain;
++++C、Asset -> Create Terrain;
++++D、Windows -> Create Terrain;
###4D.01.0三、如下哪一种操做步骤能够在场景中添加“Wind Zone”? |
++4D.01.0三、如下哪一种操做步骤能够在场景中添加“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.0四、在Unity编辑器中建立一个Directional Light,如下步骤正确的是? |
++4D.01.0四、在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.0五、下列哪一项不属于Camera中的“Clear Flags”? |
++4D.01.0五、下列哪一项不属于Camera中的“Clear Flags”?
++++立钻哥哥:D
++++A、Skybox;
++++B、Solid Color;
++++C、Depth Only;
++++D、Background;
###4D.01.0六、如下哪一种脚本语言是Unity编辑器所不支持的? |
++4D.01.0六、如下哪一种脚本语言是Unity编辑器所不支持的?
++++立钻哥哥:D
++++A、JavaScript;
++++B、C#;
++++C、Boo;
++++D、Perl;
###4D.01.0七、对于Prefab,如下说法错误的是? |
++4D.01.0七、对于Prefab,如下说法错误的是?
++++立钻哥哥:D
++++A、Prefab资源能够在项目中屡次重复使用;
++++B、由Prefab实例出的GameObject,其在Hierarchy视图中表现为蓝色;
++++C、Prefab上的组件信息一经改变,其实例出的GameObject也会自动改变;
++++D、实例出的GameObject上的组件信息一经改变,其对应的Prefab也会自动改变;
###4D.01.0八、下面哪一种作法能够打开Unity的Asset Store? |
++4D.01.0八、下面哪一种作法能够打开Unity的Asset Store?
++++立钻哥哥:A
++++A、Windows -> Asset Store;
++++B、Edit -> Asset Store;
++++C、File -> Asset Store;
++++D、Assets -> Asset Store;
###4D.01.0九、在哪一个面板中能够修改物体的空间属性,如位置、朝向、大小等? |
++4D.01.0九、在哪一个面板中能够修改物体的空间属性,如位置、朝向、大小等?
++++立钻哥哥:B
++++A、Project;
++++B、Inspector;
++++C、Hierarchy;
++++D、Toolbar;
###4D.01.十、如何为一个Asset资源设定一个Label,从而可以方便准确的搜索到? |
++4D.01.十、如何为一个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.十一、Mecanim系统中,Body Mask的做用是? |
++4D.01.十一、Mecanim系统中,Body Mask的做用是?
++++立钻哥哥:D
++++A、指定身体的某一部分是否参与骨骼动画;
++++B、指定身体的某一部分是否参与物理模拟;
++++C、指定身体的某一部分是否能够输出骨骼信息;
++++D、指定身体的某一部分是否参与渲染;
###4D.01.十二、如下哪一种操做步骤能够打开Unity编辑器的Lightmapping视图? |
++4D.01.十二、如下哪一种操做步骤能够打开Unity编辑器的Lightmapping视图?
++++立钻哥哥:C
++++A、File -> Lightmapping;
++++B、Assets -> Lightmapping;
++++C、Windows -> Lightmapping;
++++D、Component -> Lightmapping;
###4D.01.1三、下列关于光照贴图,说法错误的是? |
++4D.01.1三、下列关于光照贴图,说法错误的是?
++++立钻哥哥:C
++++A、使用光照贴图比使用实时光源渲染要快;
++++B、能够下降游戏内存消耗;
++++C、能够增长场景真实感;
++++D、多个物体可使用同一张光照贴图;
###4D.01.1四、如何为物体添加光照贴图所使用的UV? |
++4D.01.1四、如何为物体添加光照贴图所使用的UV?
++++立钻哥哥:A
++++A、不一样添加,任什么时候候都会自动生成;
++++B、更改物体导入设置,勾选“Generate Lightmap UVs”;
++++C、更改物体导入设置,勾选“Swap UVs”;
++++D、更改物体导入设置,在UVs选项中选择“Use Lightmaps”;
###4D.01.1五、在哪一个模块下能够修改Render Path? |
++4D.01.1五、在哪一个模块下能够修改Render Path?
++++立钻哥哥:D
++++A、Camera;
++++B、Light;
++++C、Render Settings;
++++D、Project Settings -> Quality;
###4D.01.1六、如下哪项技术不是目前Unity所支持的Occlusion Culling技术? |
++4D.01.1六、如下哪项技术不是目前Unity所支持的Occlusion Culling技术?
++++立钻哥哥:B、D
++++A、PVS only;
++++B、PVS and dynamic objects;
++++C、Automatic Partal Generation;
++++D、Dynamic Only;
###4D.01.1七、关于Vector3的API,如下说法正确的是? |
++4D.01.1七、关于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.1八、如下哪一个函数在游戏进入新场景后会被立刻调用? |
++4D.01.1八、如下哪一个函数在游戏进入新场景后会被立刻调用?
++++立钻哥哥:C
++++A、MonoBehaviour.OnSceneWasLoaded;
++++B、MonoBehaviour.OnSceneEnter;
++++C、MonoBehaviour.OnLevelWasLoaded;
++++D、MonoBehaviour.OnLevelEnter;
###4D.01.1九、什么是导航网格(NavMesh)? |
++4D.01.1九、什么是导航网格(NavMesh)?
++++立钻哥哥:D
++++A、一种用于描述相机轨迹的网格;
++++B、一种被优化过的物体网格;
++++C、一种用于物理碰撞的网格;
++++D、一种用于实现自动寻路的网络;
###4D.01.20、下列哪些选项不是网格层属性的固有选项? |
++4D.01.20、下列哪些选项不是网格层属性的固有选项?
++++立钻哥哥:A
++++A、Default;
++++B、Walkable;
++++C、Not Walkable;
++++D、Jump;
###4D.01.2一、在场景中放置多个Camera并同时处于活动状态使会发生什么? |
++4D.01.2一、在场景中放置多个Camera并同时处于活动状态使会发生什么?
++++立钻哥哥:多个Camera与depth有关;
###4D.01.2二、请简述Prefab的做用,并描述如何在移动设备的环境下恰当的使用它? |
++4D.01.2二、请简述Prefab的做用,并描述如何在移动设备的环境下恰当的使用它?
++++立钻哥哥:
###4D.01.2三、如何销毁一个UnityEngine.Object及其子类? |
++4D.01.2三、如何销毁一个UnityEngine.Object及其子类?
++++立钻哥哥:直接Destroy,无论是对象仍是组件;
###4D.01.2四、请简述为何Unity3D中会发生在组件上出现数据丢失的状况(missing)? |
++4D.01.2四、请简述为何Unity3D中会发生在组件上出现数据丢失的状况(missing)?
++++立钻哥哥:其实就是关系丢失了(Library目录),基本上就是没有在Unity里更名,改变位置就会出这个问题。
###4D.01.2五、请简述Unity3D下如何安全的在不一样工程间迁移Asset数据,请举出三种方式? |
++4D.01.2五、请简述Unity3D下如何安全的在不一样工程间迁移Asset数据,请举出三种方式?
++++立钻哥哥:方法1:能够把Assets目录和Library目录一块儿迁移;
++++方法2:导出包;
++++方法3:用Unity带的Assets server功能;
++++说明:我的认为只有一种方法:就是先导出UnityPackage格式,再导入另一个项目;
##4D.0二、Unity第二次模拟面试 |
++4D.0二、Unity第二次模拟面试
++++4D.02.0一、写出一我的物角色的有限状态机的简略代码,包括静止、移动、战斗、死亡几个状态的切换?
++++4D.02.0二、列举出影响游戏画面DrawCall的因素以及优化方案?
++++4D.02.0三、如图所示向量坐标关系,正确的是?
++++4D.02.0四、下面描述能够减小GC(垃圾回收)的是?
++++4D.02.0五、下面关于private,public,protected,internal的描述正确的是?
++++4D.02.0六、MeshRender中material和sharedmaterial的区别?
++++4D.02.0七、如何优化内存有哪些?
++++4D.02.0八、下列关于栈的描述正确的是?
++++4D.02.0九、二叉树的第K层的结点数最多为?
++++4D.02.十、C#中关于传值和传引用的说法正确的是?
++++4D.02.十一、C#抽象类(abstract)和接口(interface)的区别?
++++4D.02.十二、委托(delegate)与事件的区别?
++++4D.02.1三、进程间通讯有哪些方式?
++++4D.02.1四、下面关于Unity协程正确的是?
++++4D.02.1五、Arrange the event functions listed below in the order in which they will be invoked?
++++4D.02.1六、Which of the following examples will run faster? Explain your answer?
++++4D.02.1七、Answer the following questions about threading, Explain your answers?
++++4D.02.1八、What is Prefabs in Unity 3D?
++++4D.02.1九、请描述一下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.0一、写出一我的物角色的有限状态机的简略代码,包括静止、移动、战斗、死亡几个状态的切换? |
++4D.02.0一、写出一我的物角色的有限状态机的简略代码,包括静止、移动、战斗、死亡几个状态的切换?
++++立钻哥哥:有限状态机(Finite-State machine,FSM),又称有限状态自动机,简称状态机,是表示有限个状态以及在这些状态之间的转移和动做等行为的数学模型。
++++有限状态机(FSM)是游戏AI的一种常见模型。
++++FSM的结构和逻辑:
--一、AIController:用于实现各类行为动做,它做为AI行为动做的控制器;
--二、FSM:用于存放判断参数和统一调用各状态机;
--三、IState:状态机接口,等待各类状态机实现其功能;
--四、MoveState,AttackState,IdleState,DieState:各类State,每一个状态机内部实现开关逻辑;
++++【一、建立一个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{}
++++【二、建立一个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{}
++++【三、建立一个状态机接口:IState】:
public interface IState{
void Execute(AIController ac);
} //立钻哥哥:public interface IState{}
++++【四、建立多个状态机】:在状态机中实现判断和调用AIController的行为方法:
//4.一、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.二、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.0二、列举出影响游戏画面DrawCall的因素以及优化方案? |
++4D.02.0二、列举出影响游戏画面DrawCall的因素以及优化方案?
++++立钻哥哥:每次引擎准备数据并通知GPU的过程称为一次Draw Call。(是CPU调用底层图形接口。)
++++DrawCall优化能够从:CPU方面、GPU方面、内存方面等入手;
++++【一、CPU方面的优化】:drawcall影响的是CPU的效率,优化的主要思路:减小渲染次数,多个物体最好一次渲染:
--一、使用Draw Call Batching:调用批处理;(静态批处理Static Batching、动态批处理Dynamic Batching)
--二、经过纹理打包成图集来尽可能减小材质的使用;
--三、尽可能少的使用反光,阴影之类的,由于会使物体屡次渲染;
++++【二、GPU方面的优化】:影响GPU性能的两大方面:一方面是顶点数量过多,像素计算过于复杂;另外一方面就是GPU的显存带宽。
--一、减小顶点数量,简化计算复杂度;
----1.一、保持材质的数目尽量少。(这使得Unity更容易进行批处理)
----1.二、使用纹理图集(一张大贴图里包含了不少子贴图)来代替一系列单独的小贴图。(纹理图集能够更快地被加载,具备不多的状态转换,并且批处理更友好。)
----1.三、若是使用了纹理图集和共享材质,使用Renderer.sharedMaterial来代替Renderer.material;
----1.四、使用光照贴图(lightmap)而非实时灯光;
----1.五、使用LOD,好处就是对那些离得远,看不清的物体的细节能够忽略;
----1.六、遮挡剔除(Occlusion culling);
----1.七、使用mobile版的Shader,由于简单。
--二、压缩图片,以适应显存带宽;
----2.一、OpenGL ES 2.0使用ETC1格式压缩等等,在打包设置那里都有;
----2.二、使用Mipmap。(会消耗一些内存,可是为了图片渲染的质量(比压缩要好),这种方式也是推荐的。)
++++【三、内存方面的优化】:Unity游戏引擎内存大概分:一、Unity3D内部的内存;二、Mono的托管内存;三、若干咱们本身引入的DLL或者第三方DLL所需的内存;
++++补充1:Unity中,每次引擎准备数据并通知GPU的过程称为一次DrawCall。(DrawCall越高对显卡的消耗就越大)。下降DrawCall的方法:
--一、Dynamic Batching:动态批处理;
--二、Static Batching:静态批处理;
--三、高级特性Shader降级为统一的低级特性的Shader;
++++补充2:LightMap光照贴图的优势:避免动态光照在场景中的实时渲染,减小DrawCall。
###4D.02.0三、如图所示向量坐标关系,正确的是? |
++++立钻哥哥:
++++A、c=a+b;
++++B、c=a-b;
++++C、c=b-a;
++++D、c=-(a+b);
++++剖析:向量运算是3D图形,物理,动画的基础。
--一、向量加法(Addition):两个向量相加时,结果等于把这两个向量做为台阶,注意,两个向量的顺序不重要,结果是同样的。(若是第一个向量是空间中的点,则能够把第二个向量理解成一个“偏移量”)(若是向量表示的是力,那就能够更直观认为它是力的方向和大小(magnitude)。两个表示力的向量相加的结果是一个新的向量,这个向量等于两个力的结合。这个概念在使用多力的组件时很是有用。)
--二、向量减法(Subtraction):向量减法经常使用于取得一个对象到另外一个对象之间的方向和距离。(注意减法式子中的参数顺序会影响到结果)
###4D.02.0四、下面描述能够减小GC(垃圾回收)的是? |
++4D.02.0四、下面描述能够减小GC(垃圾回收)的是?
++++立钻哥哥:A、B、C
++++A、减小new产生对象的次数;
++++B、使用公用的对象(静态成员);
++++C、将String换成StringBuilder;
++++D、减小循环体循环次数;
###4D.02.0五、下面关于private,public,protected,internal的描述正确的是? |
++4D.02.0五、下面关于private,public,protected,internal的描述正确的是?
++++立钻哥哥:A、B、C、D
++++A、public:对任何类和成员都公开,无限制访问;
++++B、private:仅对类公开;
++++C、protected:对该类和其派生类公开;
++++D、internal:只能在包含该类程序集中访问该类;
###4D.02.0六、MeshRender中material和sharedmaterial的区别? |
++4D.02.0六、MeshRender中material和sharedmaterial的区别?
++++立钻哥哥:A、D
++++A、修改sharedMaterial将改变全部使用这个材质的物体外观;
++++B、修改Material将改变全部使用这个材质的物体外观;
++++C、修改sharedMaterial只改变使用当前材质的物体的外观;
++++D、修改Material只改变使用当前材质的物体的外观;
###4D.02.0七、如何优化内存有哪些? |
++4D.02.0七、如何优化内存有哪些?
++++立钻哥哥:A、B
++++A、释放AssetBundle占用的资源;
++++B、将暂时不用的之后还须要使用的物体隐藏起来而不是直接Destroy掉;
++++C、减小网络请求参数;
++++D、启用MipMap;
###4D.02.0八、下列关于栈的描述正确的是? |
++4D.02.0八、下列关于栈的描述正确的是?
++++立钻哥哥:D
++++A、栈是非线性结构;
++++B、栈是一种树状结构;
++++C、栈具备先进先出的特性;
++++D、栈具备后进先出的特性;
###4D.02.0九、二叉树的第K层的结点数最多为? |
++4D.02.0九、二叉树的第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.十、C#中关于传值和传引用的说法正确的是? |
++4D.02.十、C#中关于传值和传引用的说法正确的是?
++++立钻哥哥:A、B、C
++++A、值类型变量存储在栈上;
++++B、引用类型表示的对象存储在堆上;
++++C、传值是直接将实参的值赋给形参;
++++D、传引用是将引用表明的对象拷贝后传给函数;
###4D.02.十一、C#抽象类(abstract)和接口(interface)的区别? |
++4D.02.十一、C#抽象类(abstract)和接口(interface)的区别?
++++立钻哥哥:A、B、C
++++A、C#抽象类能够有本身的实现;
++++B、C#中能够实现多个接口;
++++C、C#只能继承一个抽象类;
++++D、C#能够继承多个抽象类;
###4D.02.十二、委托(delegate)与事件的区别? |
++4D.02.十二、委托(delegate)与事件的区别?
++++立钻哥哥:???
++++A、委托是一种安全的函数类型;
++++B、事件是一种消息机制;
++++C、事件能够携带方法体;
++++D、委托能够携带方法体;
###4D.02.1三、进程间通讯有哪些方式? |
++4D.02.1三、进程间通讯有哪些方式?
++++立钻哥哥:A、B、C
++++A、管道通讯;
++++B、消息通讯;
++++C、共享内存;
++++D、静态变量;
++++补充1:进程间通讯(IPC)的4种通讯方式:
--管道:速度慢,容量有限,只有父子进程能通信;
--消息队列:容量受到系统限制,且要注意第一次读的时候,要考虑上一次没有读完数据的问题;
--信号量:不能传递复杂消息,只能用来同步;
--共享内存区:可以很容易控制容量,速度快,但要保持同步。
###4D.02.1四、下面关于Unity协程正确的是? |
++4D.02.1四、下面关于Unity协程正确的是?
++++立钻哥哥:C
++++A、协程是不占用主线程资源;
++++B、协程不会阻塞后续执行序列;
++++C、协程能够操做UI;
++++D、协程是线程安全的;
###4D.02.1五、Arrange the event functions listed below in the order in which they will be invoked? |
++4D.02.1五、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.1六、Which of the following examples will run faster? Explain your answer? |
++4D.02.1六、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.1七、Answer the following questions about threading, Explain your answers? |
++4D.02.1七、Answer the following questions about threading, Explain your answers?
--一、Can threads be used to modify a Texture on runtime?
--二、Can threads be used to move a GameObject on the scene?
--三、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。
++++立钻哥哥:回答下面有关线程的问题:
++++一、能在运行时使用线程修改一张texture吗?
++++二、能在线程中移动一个场景中的游戏对象吗?
--只用在主线程中才能够修改UI和View,子线程中不能够修改texture和移动GameObject;
++++三、把代码移到线程中:
//例如使用相似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.1八、What is Prefabs in Unity 3D? |
++4D.02.1八、What is Prefabs in Unity 3D?
++++立钻哥哥:Prefab是一种资源类型:存储在项目视图中的一种可反复使用的游戏对象。于是当游戏中需要很是多反复使用的对象、资源等时,就能够用Prefab了。
++++Prefab拥有的特色:
--一、可以放到多个场景中。也可以在同一场景中放置屡次;
--二、当加入一个Prefab到场景中,就建立了它的一个实例;
--三、全部的Prefab实例连接到原始Prefab,本质上是原始Prefab的克隆;(运行中生成的对象会有(Clone)的标记)
--四、只要Prefabs原型发生改变,全部的Prefabs实例都会产生变化。
###4D.02.1九、请描述一下Unity中position,localPosition以及anchoredPosition之间的区别? |
++4D.02.1九、请描述一下Unity中position,localPosition以及anchoredPosition之间的区别?
++++立钻哥哥:
++++一、【Position】:是根据世界原点为中心;(是世界坐标中的位置,能够理解为绝对坐标)
++++二、【localPositio】:是根据父节点为中心;(若是没有父节点,localpositon和position是没有区别的)(相对于父对象的位置,是相对坐标。)
++++三、【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.0三、Unity第三次模拟面试 |
++++4D.03.0一、什么是协同程序(协程)? 协同程序与线程的区别是哪些?
++++4D.03.0二、请简述GC(垃圾回收)产生的缘由,并描述如何避免?
++++4D.03.0三、在物体发生碰撞的整个过程当中,有几个阶段,分别列出对应的函数?
++++4D.03.0四、Unity3d脚本从唤醒到销毁有着一套比较完整的生命周期,请列出系统自带的几个重要的方法。 物理更新通常放在哪一个系统函数里? 为何?
++++4D.03.0五、请描述游戏动画有哪几种,以及其原理?
++++4D.03.0六、LOD是什么,优缺点是什么?
++++4D.03.0七、简述矩阵相乘的意义及注意点?
++++4D.03.0八、什么是LightMap?
++++4D.03.0九、Heap与Stack有何区别?
++++4D.03.十、值类型和引用类型有何区别?
++++4D.03.十一、请列举一些Unity3d在移动设备上的一些优化资源的方法?
++++4D.03.十二、请简述水面倒影的渲染原理?
++++4D.03.1三、简单描述Prefab的用处和环境?
++++4D.03.1四、简单描述AssetBundle的做用?
++++4D.03.1五、解释一下vertex shader和pixel shader?
++++4D.03.1六、经过脚原本删除一个GameObject?
++++4D.03.1七、Unity3d脚本从唤醒到销毁有着一套比较完整的生命周期,请列出系统自带的几个重要的方法?
++++4D.03.1八、如何计算Vector3的长度?
++++4D.03.1九、Vector3.normalize有什么意思,如何计算这个值?
++++4D.03.20、补全下面代码的Update函数,让这个GameObject以speed的速度向target移动,当与target的距离小于等于1的时候中止?
++++4D.03.2一、Application.dataPath、Application.streamingAssetsPath、Application.persistentDataPath存储路径在IOS平台下,分别对应的位置是什么?
++++4D.03.2二、不使用foreach如何遍历一个Dictionary?
++++4D.03.2三、Animator的状态机有哪些类型的参数?
++++4D.03.2四、如何控制多个相机的显示顺序?
++++4D.03.2五、如何执行一个协程,如何中止一个协程?
++++4D.03.2六、指出下面代码的错误?
###4D.03.0一、什么是协同程序(协程)? 协同程序与线程的区别是哪些? |
++4D.03.0一、什么是协同程序(协程)? 协同程序与线程的区别是哪些?
++++立钻哥哥:协程称为协同程序,即在主线程运行的同时开启另外一段逻辑,来协助当前程序的执行,StartCoroutine()是开启协程,StopCoroutine()是关闭协程,协程的返回值是IEnumerator类型,而在协程内部必须有yield return **。
++++协程,线程的区别:
--一、线程拥有本身独立的栈和共享的堆,共享堆,不共享栈,线程由操做系统调度;
--二、协程和线程同样共享堆,不共享栈,协程由程序员在协程的代码里显示调度;
--三、协程避免了无心义的调度,由此能够提升性能,程序员必须本身承担调度的责任,协程也失去了标准线程使用多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.0二、请简述GC(垃圾回收)产生的缘由,并描述如何避免? |
++4D.03.0二、请简述GC(垃圾回收)产生的缘由,并描述如何避免?
++++立钻哥哥:当用new建立一个对象时,当可分配的内存不足时,GC就会去回收未使用的对象,GC的操做是很是复杂的,会占用不少CPU时间,对于移动设备来讲频繁的垃圾回收会严重影响性能。
++++建议能够避免GC频繁操做:
--一、减小用new建立对象的次数,在建立对象时会产生内存碎片,这样会形成内存没法使用;
--二、使用共用的对象(静态成员,常量),可是静态成员和常量的生命周期是整个应用程序;
--三、在拼接大量字符串时使用StringBuilder,建立StringBuilder对象时要设置StringBuilder的初始大小:StringBuilder myBuf = new StringBuilder(size);
--四、使用Object Pool(对象池)技术;
###4D.03.0三、在物体发生碰撞的整个过程当中,有几个阶段,分别列出对应的函数? |
++4D.03.0三、在物体发生碰撞的整个过程当中,有几个阶段,分别列出对应的函数?
++++立钻哥哥:物体发生碰撞主要有3个阶段:Enter、Stay、Exit;
++++一、Collider.OnCollisionEnter():进入碰撞;
++++二、Collider.OnCollisionStay():逗留碰撞;
++++三、Collider.OnCollisionExit():退出碰撞;
###4D.03.0四、Unity3d脚本从唤醒到销毁有着一套比较完整的生命周期,请列出系统自带的几个重要的方法。 物理更新通常放在哪一个系统函数里? 为何? |
++4D.03.0四、Unity3d脚本从唤醒到销毁有着一套比较完整的生命周期,请列出系统自带的几个重要的方法。 物理更新通常放在哪一个系统函数里? 为何?
++++立钻哥哥:【Awake()】=>【OnEnable()】=>【Start()】=>【FixedUpdate()】=>【Update()】=>【LateUpdate()】=>【OnBecameVisible()】=>【OnGUI()】=>【OnBecameInvisible()】=>【OnDisable()】=>【OnDestroy()】=>【OnApplicationQuit()】
++++FixedUpdate():固定帧被调用;由于不受到计算机帧频的影响,因此比较适合于作物理方面的更新;好比控制一个Rigidbody,由于物理世界不该该被帧率影响;
++++FixedUpdate(),是在固定的时间间隔执行,不受游戏帧率的影响。(时间间隔能够设置:Edit->ProjectSetting->time:设置项Fixedtimestep)
###4D.03.0五、请描述游戏动画有哪几种,以及其原理? |
++4D.03.0五、请描述游戏动画有哪几种,以及其原理?
++++立钻哥哥:游戏动画主要分:关节动画、骨骼动画、单一网格模型动画(关键帧动画);
++++【一、关节动画】:把角色分红若干独立部分,一个部分对应一个网格模型,部分的动画链接成一个总体的动画,角色比较灵活,Quake2中使用这种动画;
++++【二、单一网格模型动画】:由一个完整的网格模型构成,在动画序列的关键帧里记录各个顶点的原位置及其该变量,而后插值运算实现动画效果,角色动画较真实;
++++【三、骨骼动画】:普遍应用的动画方式,集成了以上两个方式的优势,骨骼按角色特色组成必定的层次结构,有关节相连,可作相对运动,皮肤做为单一网格蒙在骨骼以外,决定角色的外观,皮肤网格每个顶点都会受到骨骼的影响,从而实现完美的动画。
###4D.03.0六、LOD是什么,优缺点是什么? |
++4D.03.0六、LOD是什么,优缺点是什么?
++++立钻哥哥:LOD是Level of detail简称,意为多层次细节,是最经常使用的游戏优化技术。
++++LOD技术指根据物体模型的几点在显示环境中所处的位置和重要性,决定物体渲染的资源分配,下降非重要物体的面数和细节度,从而得到高效率的渲染运算。
++++LOD优势:可根据距离动态的选择渲染不一样细节的模型;
++++LOD缺点:增长美工工做量,增大了游戏的容量。
###4D.03.0七、简述矩阵相乘的意义及注意点? |
++4D.03.0七、简述矩阵相乘的意义及注意点?
++++立钻哥哥:矩阵相乘表示线性变换:平移、旋转、缩放、投影、仿射等;
++++矩阵相乘的注意点:矩阵的蠕变:偏差的积累;
###4D.03.0八、什么是LightMap? |
++4D.03.0八、什么是LightMap?
++++立钻哥哥:LightMap是一张贴图,存储了从场景中直接烘培而来的灯光信息,经过这种贴图,咱们能够减小DrawCall,提高咱们游戏的性能。(LightMap一般没有阴影,用空间换时间来加快渲染速度。)
++++补充1:LightMap称为光照贴图:把灯光和物体设置成静态,而后对灯光进行烘培,此时在物体表面造成一张有灯光效果的贴图。(把场景中的灯光删除掉,物体表面依赖有灯光的效果,这种效果是灯光贴图形成的。)
++++补充2:LightMap光照贴图的优势:避免动态光照在场景中的实时渲染,减小DrawCall。
++++补充3:【Windows->Lightmapping】:能够打开Unity编辑器的Lightmapping视图。
###4D.03.0九、Heap与Stack有何区别? |
++4D.03.0九、Heap与Stack有何区别?
++++立钻哥哥:stack栈空间有限,heap堆的空间是很大的自由区。
++++【heap堆】:存储引用类型,好比:类,接口,数组等;(heap堆的空间是手动申请和释放的,经常使用new关键字来分配)
++++【stack栈】:存储值类型,即存储固定长度的数据,好比:整数、字符、结构、布尔、枚举等。(stack栈的空间由操做系统自动分配和释放)
###4D.03.十、值类型和引用类型有何区别? |
++4D.03.十、值类型和引用类型有何区别?
++++立钻哥哥:一、值类型继承自System.ValueType,引用类型继承自System.Object;
++++二、值类型存储在内存栈中;引用类型数据存储在内存堆中,而内存单元中存放的是堆中存放的地址;
++++三、值类型存取快;引用类型存取快;
++++四、值类型表示实际数据;引用类型表示指向存储在内存堆中的数据的指针和引用;
++++五、栈的内存是自动释放的;堆内存在.Net中会由GC自动释放;
###4D.03.十一、请列举一些Unity3d在移动设备上的一些优化资源的方法? |
++4D.03.十一、请列举一些Unity3d在移动设备上的一些优化资源的方法?
++++立钻哥哥:一、使用AssetBundle,实现资源分离和共享,将内存控制到200M以内,同时也能够实现资源的在线更新;
++++二、顶点数对渲染不管是CPU仍是GPU都是压力最大的,下降顶点数到8万如下,FPS稳定在30帧左右;
++++三、只使用一盏动态灯,不使用阴影,不使用光照探头;
++++四、粒子系统是CPU上的大头:
--4.一、剪裁粒子系统;
--4.二、合并同时出现的粒子系统;
--4.三、本身实现轻量级的粒子系统;
++++五、Animator也是一个效率奇差的地方:
--5.一、把不须要跟骨骼动画和动做过渡的地方所有使用Animation,控制骨骼数量在30根如下;
--5.二、Animator出视野不更新;
--5.三、删除无心义的animator;
--5.四、Animator的初始化很耗时;
--5.五、除主角外都不要跟骨骼运动(Apply root motion);
--5.六、绝对禁止掉那些不带刚体带包围盒的物体(static collider)运动;
++++六、不要每帧计算ViewSize和WindowSize;
++++七、给美术定一个严格的通过科学验证的美术标准,并在U3D里面配以相应的检测工具;
###4D.03.十二、请简述水面倒影的渲染原理? |
++4D.03.十二、请简述水面倒影的渲染原理?
++++立钻哥哥:一、第一个思路:在物体上(非水面对象亦可)添加shader,这个shader有两个Pass通道:一个正常渲染;一个渲染倒影(反过来再作扭曲);
++++二、第二个思路:在水面对象上加Shader,这个Shader有两个做用:一是对原有水面的像素进行扰动;二是对环境中的物体进行图像采集,而后融合到水面纹理当中;
++++水面倒影的渲染原理:对水面的贴图纹理进行扰动,以产生波光粼粼的效果。(用Shader能够经过GPU在像素级别作扰动,效果细腻,须要的顶点少,速度快。)
###4D.03.1三、简单描述Prefab的用处和环境? |
++4D.03.1三、简单描述Prefab的用处和环境?
++++立钻哥哥:Prefab是预制体,通常当游戏中须要频繁建立一个物体时,使用预制体能够节省内存,方便建立,方便对游戏物体进行操做,方便对属性进行修改。
++++补充1:Prefab资源能够在项目中屡次重复使用;由Prefab实例出的GameObject,其在Hierarchy视图中表现为蓝色;Prefab上的组件信息一经改变,其实例出的GameObject也会自动改变;
++++补充2:Prefab是一种资源类型:存储在项目视图中的一种可反复使用的游戏对象;于是当游戏中需要很是多反复使用的对象、资源等时,就能够用Prefab了。
++++Prefab拥有的特色:
--一、可以放到多个场景中,也可以在同一场景中放置屡次;
--二、当加入一个Prefab到场景中,就建立了它的一个实例;
--三、全部的Prefab实例连接到原始Prefab,本质上是原始Prefab的克隆;(运行中生成的对象会有(Clone)的标记)
--四、只要Prefabs原型发生改变,全部的Prefabs实例都会产生变化。
###4D.03.1四、简单描述AssetBundle的做用? |
++4D.03.1四、简单描述AssetBundle的做用?
++++立钻哥哥:AssetBundle是Unity引擎提供的一种资源压缩文件,文件扩展名一般为Unity3d或assetbundle。
++++AssetBundle的用途:一、更新资源;二、压缩资源,减小所占空间;
###4D.03.1五、解释一下vertex shader和pixel shader? |
++4D.03.1五、解释一下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.1六、经过脚原本删除一个GameObject? |
++4D.03.1六、经过脚原本删除一个GameObject?
++++立钻哥哥:Destroy(myObj);
++++public static void Destroy(Object obj, float t = 0.0f);
++++补充1:Unity中提供了销毁对象的三种方式:
--1.一、Destroy();
----static void Destroy(Object obj, float t = 0.0F);
----删除一个游戏物体或组件等。
----若是Object实际上为组件,则将其从gameObject中删除并销毁;
----若是实际上gameObject则将销毁它的所有组件及其全部子物体;
--1.二、DestroyImmediate();
----static void DestroyImmediate(Object obj, bool allowDestroyingAsset = false);
----该函数会将资源永久销毁。
--1.三、DontDestroyOnLoad();
----static void DontDestroyOnLoad(Object target);
----做用是在加载新场景的时候使目标物体不被自动销毁;
----若是物体时一个组件或游戏对象,则全部的Transform层次都不会被销毁,所有保留下来;
--提示:Object中的静态函数在程序中调用的时候,能够直接调用,不用写类名。
###4D.03.1七、Unity3d脚本从唤醒到销毁有着一套比较完整的生命周期,请列出系统自带的几个重要的方法? |
++4D.03.1七、Unity3d脚本从唤醒到销毁有着一套比较完整的生命周期,请列出系统自带的几个重要的方法?
++++立钻哥哥:【Awake()】=>【OnEnable()】=>【Start()】
=>【FixedUpdate()】=>【Update()】=>【LateUpdate()】
=>【OnBecameVisible()】=>【OnGUI()】=>【OnBecameInvisible()】
=>【OnDisable()】=>【OnDestroy()】=>【OnApplicationQuit()】
###4D.03.1八、如何计算Vector3的长度? |
++4D.03.1八、如何计算Vector3的长度?
++++立钻哥哥:Vector3.magnitude(float magnitude):返回向量的长度(只读)。
++++magnitude:向量的长度是(x*x + y*y + z*z)的平方根;
++++若是须要比较一些向量的长度,能够比较它们的长度的平方:使用sqrMagnitude(就是平方很快,由于计算机求开发比较消耗内存和时间。)
###4D.03.1九、Vector3.Normalize有什么意思,如何计算这个值? |
++4D.03.1九、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(){ } } |
++++立钻哥哥:
++++思路一、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.二、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.2一、Application.dataPath、Application.streamingAssetsPath、Application.persistentDataPath存储路径在IOS平台下,分别对应的位置是什么? |
++4D.03.2一、Application.dataPath、Application.streamingAssetsPath、Application.persistentDataPath存储路径在IOS平台下,分别对应的位置是什么?
++++立钻哥哥:
++++【Application.dataPath】:用于返回程序的数据文件所在文件夹的路径;
++++【Application.streamingAssetsPath】:用于返回流数据的缓存目录,返回路径为相对路径,适合设置一些外部数据文件的路径;
++++【Application.persistentDataPath】:用于返回一个持久化数据存储目录的路径,能够在此路径下存储一些持久化的数据文件;
++++【Application.temporaryCachePath】:用于返回一个临时数据的缓存目录。
++++【一、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
++++【二、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
++++【三、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.2二、不使用foreach如何遍历一个Dictionary? |
++4D.03.2二、不使用foreach如何遍历一个Dictionary?
++++立钻哥哥:遍历字典:Dictionary<string, int> dic = new Dictionary<string, int>();
for(int i = 1; i <= dic.Count; i++){
}
###4D.03.2三、Animator的状态机有哪些类型的参数? |
++4D.03.2三、Animator的状态机有哪些类型的参数?
++++立钻哥哥:Animator状态机参数类型:int、bool、float、trigger;
###4D.03.2四、如何控制多个相机的显示顺序? |
++4D.03.2四、如何控制多个相机的显示顺序?
++++立钻哥哥:调整相机的深度(Depth);
###4D.03.2五、如何执行一个协程,如何中止一个协程? |
++4D.03.2五、如何执行一个协程,如何中止一个协程?
++++立钻哥哥:StartCoroutine():开启协程;
++++StopCoroutine():关闭协程;
###4D.03.2六、指出下面代码的错误? |
++4D.03.2六、指出下面代码的错误?
using UnityEngine; using System.Collections;
public class TEST : MonoBehaviour{ void Start(){ transform.position.x = 10; } } |
++++立钻哥哥:没法修改“Transform.position”的返回值,由于它不是变量;
##4D.0四、Unity第四次模拟面试 |
++4D.0四、Unity第四次模拟面试
++++4D.04.0一、Prefab的做用,如何获取Prefab实例化出来的GameObject的预置类型,PrefabInstance,ModelPrefabInstance等预置类型有什么不一样?
++++4D.04.0二、资源如何经过AssetBundle打包和加载?
++++4D.04.0三、AssetDatabase.LoadAssetAtPath和Resource.Load分别适用于什么场合?
++++4D.04.0四、正交摄像机和透视摄像机的区别,第一人称摄像机Fov变化会产生怎样的摄像机效果?
++++4D.04.0五、RigidBody的用途,Kinematic的RigidBody和普通RigidBody的区别?
++++4D.04.0六、如何计算RigidBody间反弹的弹力大小,该弹力大小和包围盒大小以及Mass之间的关系,并举例说明对场景进行破坏时如何给RigidBody施力或赋予冲量?
++++4D.04.0七、披风等如何使用柔布系统实现?
++++4D.04.0八、协程的用途,协程和线程有什么区别?
++++4D.04.0九、yield关键字何时使用,yield break/yield return有什么区别?
++++4D.04.十、物体自身旋转使用的函数? 物体设定为某个姿态(旋转角度)的函数?
++++4D.04.十一、获取、增长、删除组件的命令分别是什么?
++++4D.04.十二、如下说法正确的是?
++++4D.04.1三、程序输出结果为?
++++4D.04.1四、如下程序的输出结果为?
++++4D.04.1五、Unity程序中,有Controller.cs和NewScript.cs两个脚本,Controller.cs脚本挂载到MainCamera主摄像机下,程序是否能正常运行,有什么问题,该如何修改或优化?
++++4D.04.1六、鼠标左键点击,主摄像头向鼠标点发射射线,判断射线是否碰到标签为“cube”的物体,打印物体的名称?
++++4D.04.1七、数列1,1,2,3,5,8,13... 第n位数是多少,分别用递归和循环实现,比较两种算法的时间复杂度和空间复杂度,是否还能继续优化?
++++4D.04.1八、已知arrayA和arrayB是已经排序好的数组,从大到小,如今要合并这两个数组内的数到一个数组,仍然要求是从大到小排序。请写出代码?
++++4D.04.1九、用C#或别的语言写一段代码,计算一个桌子的体积。
++++4D.04.2一、解释一下协同程序?
++++4D.04.2二、如何避免切换场景时销毁一个GameObject?
++++4D.04.2三、如何优化内存?
++++4D.04.2四、简述怎样作UI的适配?
++++4D.04.2五、Unity中如何调用JavaClass的方法?
++++4D.04.2六、C#的委托是什么? 有何用处?
++++4D.04.2七、简述四元数的做用,四元数对欧拉角的优势?
++++4D.04.2八、描述一下C#的泛型?
++++4D.04.2九、值类型和引用类型有何区别?
++++4D.04.30、按顺序列出几个主要的MonoBehaviour生命周期函数并解释下Update和FixedUpdate和LateUpdate的做用和区别?
++++4D.04.3一、如何安全的在不一样工程间安全地迁移Asset数据?
++++4D.04.3二、MipMap是什么,做用?
++++4D.04.3三、.Net与Mono的关系?
++++4D.04.3四、ref参数和out参数是什么? 有什么区别?
++++4D.04.3五、Unity和Android与iOS如何交互?
++++4D.04.3六、(机试)用UGUI实现一个简单背包系统,尽你掌握的知识完善它?
++++4D.04.3七、(机试)生成100之内的100个随机数,要求不重复?
++++4D.04.3八、(机试)写出几种经常使用的排序算法?
++++4D.04.3九、(机试)编写一个函数能够输出斐波那切数列任意位置的值?
###4D.04.0一、Prefab的做用,如何获取Prefab实例化出来的GameObject的预置类型,PrefabInstance,ModelPrefabInstance等预置类型有什么不一样? |
++4D.04.0一、Prefab的做用,如何获取Prefab实例化出来的GameObject的预置类型,PrefabInstance,ModelPrefabInstance等预置类型有什么不一样?
++++立钻哥哥:预制物体的类型,可经过EditorUtility.GetPrefabType()返回;(这是一个编辑器类,若是想使用须要把它放到工程目录下的Assets/Editor文件夹下,命名空间:using UnityEditor;)
++++【PrefabInstance】:物体是一个用户建立的预置的实例;
++++【ModelPrefabInstance】:物体是一个导入3D模型预置的实例;
###4D.04.0二、资源如何经过AssetBundle打包和加载? |
++4D.04.0二、资源如何经过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.0三、AssetDatabase.LoadAssetAtPath和Resource.Load分别适用于什么场合? |
++4D.04.0三、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.0四、正交摄像机和透视摄像机的区别,第一人称摄像机Fov变化会产生怎样的摄像机效果? |
++4D.04.0四、正交摄像机和透视摄像机的区别,第一人称摄像机Fov变化会产生怎样的摄像机效果?
++++立钻哥哥:Fov(Field of View):表示视场;(这是在摄像机中可以看到的那部分场景)
++++【透视摄像机(Perspective)】:这种摄像机的效果更贴近真实世界。(有近大远小效果)
++++【正交摄像机(Orthographic)】:对象相对于摄像机的距离对渲染的结果没有影响。
++++视角Fov:镜头能覆盖的范围,第一人称摄像机Fov变化后视野会随着数值变大而变宽;
###4D.04.0五、RigidBody的用途,Kinematic的RigidBody和普通RigidBody的区别? |
++4D.04.0五、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.0六、如何计算RigidBody间反弹的弹力大小,该弹力大小和包围盒大小以及Mass之间的关系,并举例说明对场景进行破坏时如何给RigidBody施力或赋予冲量? |
++立钻哥哥推荐的拓展学习连接(Link_Url):
++++立钻哥哥Unity 学习空间: http://blog.csdn.net/VRunSoftYanlz/
++++Unity面试题ABC:http://www.javashuo.com/article/p-mwacxwca-gm.html
++++Unity面试题DEF:http://www.javashuo.com/article/p-wuwcrclr-s.html
++++Unity知识点0001:http://www.javashuo.com/article/p-ryvdxxjr-ep.html
++++Unity知识点0008:http://www.javashuo.com/article/p-kxgstxls-gu.html
++++Unity引擎基础:http://www.javashuo.com/article/p-beommoeb-ka.html
++++Unity面向组件开发:http://www.javashuo.com/article/p-eigmuvut-dt.html
++++Unity物理系统:http://www.javashuo.com/article/p-nqvvciwv-kd.html
++++Unity2D平台开发:http://www.javashuo.com/article/p-ycaagdtj-hs.html
++++UGUI基础:http://www.javashuo.com/article/p-rukxwckw-mc.html
++++UGUI进阶:http://www.javashuo.com/article/p-wcatruhq-gt.html
++++UGUI综合:http://www.javashuo.com/article/p-dkccmqii-gg.html
++++Unity动画系统基础:http://www.javashuo.com/article/p-mbrdouxy-dq.html
++++Unity动画系统进阶:http://www.javashuo.com/article/p-aqaqpbkh-bp.html
++++Navigation导航系统:http://www.javashuo.com/article/p-dswwllas-t.html
++++Unity特效渲染:http://www.javashuo.com/article/p-ckojjyfj-bp.html
++++Unity数据存储:http://www.javashuo.com/article/p-bvlzynso-m.html
++++Unity中Sqlite数据库:http://www.javashuo.com/article/p-ejutsbxl-ca.html
++++WWW类和协程:http://www.javashuo.com/article/p-dbwmhsav-cy.html
++++Unity网络:http://www.javashuo.com/article/p-sqrlntgh-dw.html
++++C#事件:http://www.javashuo.com/article/p-zmwruvql-gm.html
++++C#委托:http://www.javashuo.com/article/p-uozpymaf-gh.html
++++C#集合:http://www.javashuo.com/article/p-sfqfdqsf-ex.html
++++C#泛型:http://www.javashuo.com/article/p-xrttqngo-ee.html
++++C#接口:http://www.javashuo.com/article/p-vhlfplgv-dm.html
++++C#静态类:https://blog.csdn.net/vrunsoftyanlz/article/details/78630979
++++C#中System.String类:http://www.javashuo.com/article/p-olslkfao-cq.html
++++C#数据类型:http://www.javashuo.com/article/p-hmabbtmc-ba.html
++++Unity3D默认的快捷键:http://www.javashuo.com/article/p-wuwcrclr-s.html
++++游戏相关缩写:http://www.javashuo.com/article/p-mwacxwca-gm.html
++++设计模式简单整理:http://www.javashuo.com/article/p-rngqugib-hg.html
++++U3D小项目参考:https://blog.csdn.net/vrunsoftyanlz/article/details/80141811
++++UML类图:http://www.javashuo.com/article/p-sxberuew-bm.html
++++U3D_Shader编程(第一篇:快速入门篇):http://www.javashuo.com/article/p-kyppgrac-gz.html
++++U3D_Shader编程(第二篇:基础夯实篇):http://www.javashuo.com/article/p-qkyowtli-hv.html
++++框架知识点:http://www.javashuo.com/article/p-eufbowgf-u.html
++++游戏框架(UI框架夯实篇):http://www.javashuo.com/article/p-cvemoigb-cu.html
++++游戏框架(初探篇):http://www.javashuo.com/article/p-zfpoilbc-hy.html
++++Lua快速入门篇(基础概述):http://www.javashuo.com/article/p-shernvtt-u.html
++++Lua快速入门篇(XLua教程):http://www.javashuo.com/article/p-pduvmusb-ho.html
++++Lua快速入门篇(Xlua拓展):http://www.javashuo.com/article/p-rrszijom-cm.html
++++立钻哥哥Unity 学习空间: http://blog.csdn.net/VRunSoftYanlz/
--_--VRunSoft:lovezuanzuan--_--