### Unity3D 面试宝典2018知识点详解 #### 一、什么是协同程序? 协同程序(Coroutine)是一种轻量级的线程控制技术,在Unity中它允许脚本执行非阻塞操作,即在主线程继续执行的同时进行另一段逻辑处理。不同于传统的多线程模型,协同程序实际上是在主线程内执行的,它依靠Unity的更新循环来进行调度。每当一帧结束时,Unity会检查协同程序的状态,并判断yield语句的条件是否满足。如果条件满足,则继续执行协同程序中的后续代码。 #### 二、Unity3d中的碰撞器和触发器的区别? - **碰撞器**:是一个组件,用于检测两个物体之间的碰撞。它可以被赋予物理属性,如质量、摩擦力等。 - **触发器**:是碰撞器的一个特殊类型,当它的`isTrigger`属性被设置为`true`时,它不再参与碰撞计算,而是作为检测物体进入、停留和退出的手段。触发器主要用于不希望影响物体运动的情况下检测物体间的相互作用。 - **碰撞事件**:当`isTrigger`为`false`时,碰撞器之间会产生碰撞效果,并且可以响应`OnCollisionEnter`、`OnCollisionStay`和`OnCollisionExit`事件。 - **触发事件**:当`isTrigger`为`true`时,碰撞器可以响应`OnTriggerEnter`、`OnTriggerStay`和`OnTriggerExit`事件。 #### 三、物体发生碰撞的必要条件? - **碰撞器**:两个物体都必须附有碰撞器组件。 - **刚体**:至少一个物体还需要附有刚体组件(`Rigidbody`),以便检测运动状态下的碰撞。 - **相对运动**:两个物体之间需要有相对运动才能检测到碰撞。 #### 四、ArrayList与List的主要区别? - **类型安全性**:`ArrayList`是一个非泛型集合,所有元素都被视为`object`类型,因此在添加和获取元素时需要进行装箱和拆箱操作,这会导致额外的性能开销。而`List<T>`是泛型集合,类型安全且无需装箱拆箱。 - **功能相似性**:两者在基本功能上相似,但`List<T>`提供更好的性能和类型安全性。 - **适用场景**:`ArrayList`已逐渐被淘汰,建议使用`List<T>`来替代。 #### 五、如何安全地在不同工程间迁移asset数据? - **方法1**:将`Assets`目录及其对应的`Library`目录一起迁移。这样可以保持项目的完整性和一致性。 - **方法2**:使用Unity的导出包功能(`Export Package`),可以选择性地导出所需的资源和脚本。 - **方法3**:利用Unity内置的`Asset Server`功能,这是一种更高级的方法,适用于大型团队协作项目。 #### 六、OnEnable、Awake、Start运行时的发生顺序? - **顺序**:`Awake` → `OnEnable` → `Start` - **可重复性**:`OnEnable`可以在对象的生命周期中多次调用,例如在对象重新激活时。 #### 七、MeshRenderer中material与sharedMaterial的区别? - **material**:用于直接修改特定渲染器的材质设置,不会影响其他共享相同材质的物体。 - **sharedMaterial**:修改`sharedMaterial`会影响所有使用相同材质的物体。通常不推荐直接修改`sharedMaterial`,除非需要全局更改。 #### 八、Unity提供的光源类型及特点 Unity提供了以下几种光源: - **平行光**:模拟太阳光,照射方向相同。 - **点光源**:从一个点向四周均匀发射光线。 - **聚光灯**:类似于手电筒或舞台灯光,有一个明确的方向和角度。 - **区域光源**:模拟平面光源,如地面灯。 #### 九、对象池概念及其在FPS游戏中的应用 - **定义**:对象池是一个存储可重复使用的游戏对象的集合。通过预先加载这些对象并在需要时重用它们,可以提高游戏性能。 - **应用场景**:在FPS游戏中,子弹、敌人、粒子特效等频繁生成和销毁的对象非常适合使用对象池技术。 #### 十、CharacterController与Rigidbody的区别 - **CharacterController**:是一种特殊的刚体组件,设计用于第一人称或第三人称角色的简单物理行为。它比`Rigidbody`更容易控制,但物理模拟不够精确。 - **Rigidbody**:提供了完整的物理模拟能力,适用于复杂的物理交互。 #### 十一、Prefab的用途 - **用途**:`Prefab`是一种预制物体,用于保存游戏对象及其组件的配置。在游戏中可以通过实例化`Prefab`来快速创建多个相同或相似的游戏对象,有助于减少开发工作量并提高效率。 #### 十二、sealed关键字的用法 - **类声明**:`sealed`关键字用于类声明时,表示该类不能被继承。 - **方法声明**:用于方法声明时,表示该方法不能被子类覆盖。 #### 十三、访问修饰符的区别 - **public**:公开,允许从任何地方访问。 - **private**:私有,只允许在定义它的类内部访问。 - **protected**:受保护,允许在定义它的类及其派生类中访问。 - **internal**:只允许在定义它的程序集内访问。 #### 十四、使用Unity3d实现2d游戏的方法 - **使用Unity GUI**:适用于早期版本的Unity。 - **UGUI**:Unity 4.6之后引入的新界面系统,支持更强大的2D UI功能。 - **调整摄像机**:将摄像机投影模式设置为`Orthographic`,忽略Z轴,实现2D视觉效果。 - **使用2D插件**:如2D Toolkit (2Dtk) 和 NGUI,这些插件提供额外的功能支持2D游戏开发。 #### 十五、碰撞检测过程中的回调函数 - **OnCollisionEnter**:物体首次接触时调用。 - **OnCollisionStay**:物体持续接触期间每帧调用。 - **OnCollisionExit**:物体分离时调用。 #### 十六、Unity3D中施加力的方式 - **使用Rigidbody.AddForce()**:在指定方向上施加力。 - **使用Rigidbody.AddTorque()**:施加扭矩,改变旋转速度。 - **使用Rigidbody.AddExplosionForce()**:模拟爆炸力,力的大小随距离增加而减小。 - **使用Rigidbody.AddRelativeForce()**:相对于物体自身坐标系施加力。 - **使用Rigidbody.AddForceAtPosition()**:在指定位置施加力,会产生扭矩效应。
- 粉丝: 2
- 资源: 17
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助