1.CharacterController和Rigidbody的区别?
Rigidbody具有完全真实物理的特性,而CharacterController可以说是受限的的Rigidbody,具有一定的物理效果但不是完全真实的。
2.物体发生碰撞时,有几个阶段,分别对应的函数?
三个阶段,OnCollisionEnter/Stay/Exit函数
3.几种施加力的方式?
rigidbody.AddForce/AddForceAtPosition
4.Unity3d提供了几种光源,分别是什么?
共4种,DirectionalLight、PointLight、SpotLight、AreaLight(用于烘焙)
5.物理更新一般在哪个系统函数里?
FixedUpdate,每固定帧绘制时执行一次,和update不同的是FixedUpdate是渲染帧执行,如果你的渲染帧效率低下的时候FixedUpdate调用次数就会跟着下降。FixedUpdate比较适合用于物理引擎的计算,因为是跟每帧的渲染有关。
Update就比较适合做控制。
6.移动相机动作在哪个函数里,为什么在这个函数里。
LateUpdate,是在所有的update结束后才调用,比较适合用于命令脚本的执行。官网上例子是摄像机的跟随,都是所有的update操作完才进行摄像机的跟进,不然就有可能出现摄像机已经推进了,但是视角里还没有角色的空帧出现。
7.简述一下Prefab的用处?
在游戏运行时实例化,prefab相当于一个模板,对你已经有的素材、脚本、参数做一个默认的配置,以便于以后的修改,同时 prefab打包的内容简化了导出的操作,便于团队的交流。
8.简述一下对象池,你觉得在FPS游戏里哪些东西适合使用对象池?
对象池就存放需要被反复调用资源的一个空间,比如游戏中要常被大量复制的对象,子弹,敌人,以及任何重复出现的对象。
9.Unity中碰撞器(Collider)和触发器(Trigger)的区别?
① 碰撞器(Collider)有碰撞效果,IsTrigger=false,可以调用OnCollisionEnter/Stay/Exit函数
② 触发器(Trigger)没有碰撞效果,isTrigger=true,可以调用OnTriggerEnter/Stay/Exit函数
10.使用Unity3d实现2d游戏,有几种方式?
①使用本身的GUI;
②把摄像机Projection(投影)值调为Orthographic(正交投影),不考虑z轴;
③使用2d插件,如:2DToolKit.
11.动态加载资源的方式?
①Resources.Load(); ②AssetBundle
12.如何优化内存?
①压缩自带类库;
②.将暂时不用的以后还需要使用的物体隐藏起来而不是直接Destroy掉;
③释放AssetBundle占用的资源;
④降低模型的片面数,降低模型的骨骼数量,降低贴图的大小;
⑤使用光照贴图,使用多层次细节(LOD),使用着色器(Shader),使用预设(Prefab)。
13.请简述如何在不同分辨率下保持UI的一致性
NGUI很好的解决了这一点,屏幕分辨率的自适应性,原理就是计算出屏幕的宽高比跟原来的预设的屏幕分辨率求出一个对比值,然后修改摄像机的size。UGUI通过锚点和中心点和分辨率也解决这个问题
15.请简述private,public,protected,internal的区别
public:对任何类和成员都公开,存取不受限制
private:只有包含该成员的类可以存取
protected:只有包含该成员的类以及派生类可以存取
internal:只有当前工程可以存取
protected internal:protected + internal
16.Unity3D的协程和C#线程之间的区别是什么?
答:多线程程序同时运行多个线程 ,而在任一指定时刻只有一个协程在运行,并且这个正在运行的协同程序只在必要时才被挂起。 除主线程之外的线程无法访问Unity3D的对象、组件、方法。
Unity3d没有多线程的概念,不过unity也给我们提供了 StartCoroutine (协同程序)和 LoadLevelAsync (异步加载关卡)后台加载场景的方法。
在 StartCoroutine 的函数体里处理一段代码时,利用 yield 语句等待执行结果,这期间不影响主程序的继续执行,可以协同工作。
17.值类型和引用类型有何区别?
1.值类型的数据存储在内存的栈中;引用类型的数据存储在内存的堆中,而内存单元中只存放堆中对象的地址。
2.值类型存取速度快,引用类型存取速度慢。
3.值类型表示实际数据,引用类型表示指向存储在内存堆中的数据的指针或引用
4.值类型继承自System.ValueType,引用类型继承自System.Object
5.栈的内存分配是自动释放;而堆在.NET中会有GC来释放
6.值类型的变量直接存放实际的数据,而引用类型的变量存放的则是数据的地址,即对象的引用。