unity常见面试题目 联系客服

发布时间 : 星期日 文章unity常见面试题目更新完毕开始阅读c59f8186f01dc281e43af01b

1. 游戏对象

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

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

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

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

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

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

2. 协同程序(Coroutine)

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

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

使用MonoBehaviour.StartCoroutine方法即可开启一个协同程序。 使用StopCoroutine(string methodName)来终止一个协同程序,使用

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

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

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

Resources.Load();Resources.LoadAll() AssetBundle

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

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

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

1.使用本身的GUI;

2.把摄像机的Projection(投影)值调为Orthographic(正交投影),不考虑z轴; 3.使用2d插件,如:2DToolKit、Uni2D; 4.Unity 4.3版本新增的Native 2D(原生)

5. AssetBundle

AssetBundle的管理总共分为三部分:1、AssetBundle文件2、AssetBundle内存镜像3、AssetBundle内存对象实例 一张图读懂AssetBundle内存管理机制

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

常见问题:

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

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

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

这种情况应该在Destroy以后用:AssetBundle1.Unload(true),彻底释放干净。 如果这个AssetBundle1是要反复读取的不方便Unload,那可以在Destroy以后用:Resources.UnloadUnusedAssets()把所有和这个npc有关的Asset都销毁。 当然如果这个NPC也是要频繁创建销毁的那就应该让那些Assets呆在内存里以加速游戏体验。

由此可以解释另一个之前有人提过的话题:为什么第一次Instantiate一个Prefab的时候都会卡一下,因为在你第一次Instantiate之前,相应的Asset对象还没有被创建,要加载系统内置的AssetBundle并创建Assets,第一次以后你虽然Destroy了,但Prefab的Assets对象都还在内存里,所以就很快了。 问题:unity3d中如何实现动态资源加载? 使用AssetBundle技术,通过WWW类从服务器下载AssetBundle资源包,将需要的资源加载到项目中。AssetBundle资源包带有版本号,用来判断是否需要更新。

问题:AssetBunlde的优点? 可以动态加载资源

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

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

6. 组件(组件思想)

是什么?

Unity3D面向对象编程最大的体现就是组件化,任何一个游戏对象都是通过附加不同的组件实现。每一个游戏对象都具有一个Transform组件。 问题:获取、增加、删除组件的命令分别是什么? 获取:GetComponent增加:AddComponent删除:Destroy

7. 物理引擎

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

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

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

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

对Rigidbody施加力的常用方式?

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

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

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

有碰撞器Collider 碰撞器和触发器的区别?

最大的区别是碰撞器有碰撞效果触发器没有;触发器是一个特殊的碰撞器。 Collider有几种?(三种)

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

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

3、Kinematic rigidbody collider:带有rigidbody的collider对象,开启Is kinematic。 当物体进来OnTriggerEnter触发,出去时OnTriggerExit触发。那么物体在进来后Destory后会如何?

经过测试是:不会调用OnTriggerExit。 PhysicMaterial有哪些主要属性?

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

Bounciness:弹力,0值没有弹力,1-没有能量损失的反弹。 Character Controller(角色控制器)的特性

角色本身不受Physics影响,需要接受外力作用时,使用OnCharacterColliderHit(); 使用角色控制器如何防止角色经常卡住? Skin Width:设置为radius的10%;

Step offset:对于2meter(米)高的Character设为0.1到0.4; Min move distance设为0即可。 Rigidbody常用属性?

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

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

使用Physics时不要使用Transform CharacterController和Rigidbody的区别?

CharacterController自带胶囊碰撞器,里面包含有刚体的属性; Rigidbody就是刚体,使物体带有刚体的特征。 什么是Trigger?

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

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

OnCollisionEnter(进入)、OnCollisionStay(保持)、OnCollisionExit(退出) 什么叫做链条关节?