Unity之Unity面试题(三)

内容将会持续更新,有错误的地方欢迎指正,谢谢!

Unity之Unity面试题(三)


|-----------------------------------------------------|
| TechX 坚持将创新的科技带给世界! 拥有更好的学习体验 ------ 不断努力,不断进步,不断探索 |

|------------------------------------------------------|
| TechX ------ 心探索、心进取! 助力快速掌握 面试题 为面试者节省宝贵的学习时间,避免困惑! |


文章目录


一、Unity提供了几种光源,分别有什么?

  1. Directional Light 平行光
  2. Point Light 点光源
  3. Spot Light 聚光灯
  4. Area Light 区域光 无法作用与实时光照,一般用于光照贴图烘焙

二、两个物体发生碰撞的条件?接触的方式有什么?碰撞有几个阶段,对应的函数是什么?

  1. 两个碰撞的物体都必须有Collider组件,且至少一个物体有Rigidbody组件
  2. 其中运动的那个物体必须有Rigidbody组件,另一个物体可以带可以不带

对于有Rigidbody组件的物体,我们可以把它当作一个有质量且受力作用的刚体,而没有该组件的物体,我们认为它是静态物体,不受力的影响

物体碰撞有两种接触方式:

  1. Collision碰撞 造成物理碰撞
    条件: 两个碰撞器都不要勾选isTrigger,运动的那个Rigidbody不要勾选Is Kinematic,当为true时,物体不受物理引擎的影响
  • 进入碰撞器 OnCollisionEnter()
  • 停留碰撞器 OnCollisionStay()
  • 退出碰撞器 OnCollisionExit()
  1. Trigger触发 取消所有的物理碰撞
    条件: 至少有一个碰撞器需要勾选isTrigger
  • 进入碰撞器 OnTriggerEnter()
  • 停留碰撞器 OnTriggerStay()
  • 退出碰撞器 OnTriggerExit()

三、CharacterController组件

  1. CharacterController为角色控制器,角色控制器一般用于第一人称或第三人称游戏主角的控制。

  2. 添加了CharacterController组件后,人物将不受外力的作用,即使添加Rigidbody组件,并启用重力,人物不会受力的作用,也就是说CharacterController屏蔽了Rigidbody的属性和方法(前提是调用了CharacterController类里面的方法)。

  3. 控制角色控制器移动有两种方法:

    • SimpleMove() 简单移动,会自动应用重力
    • Move() 复杂运动,不会应用重力
  4. 角色控制器不受外力的作用,但是可以进行碰撞检测,一般碰撞的条件是两个碰撞的物体都必须有Collider组件,并且至少有一个Rigidbody组件,但是如果一方有CharacterController组件,则另一方只要有Collider组件就可以产生碰撞,CharacterController本身就继承了Collider类。

  5. CharacterController不受外力的作用,同时也不会对它所碰撞的物体施加力的作用,3 除非在OnControllerColliderHit()回调中对被碰撞的物体的Rigidbody上施加力

总结:CharaterController 不受物理引擎的影响,即使添加了Rigidbody,但是他的运动受制于碰撞。


四、Unity 对物体施加力的方式有几种,描述一下

1、力的方式

  1. Rigidbody.AddForce()
    在世界坐标系中,对刚体上添加一个力
  2. Rigidbody.AddRelativeForce()
    相对自身坐标系,对刚体添加一个力
  3. Rigidbody.AddTorque()
    在世界坐标系中,对刚体上添加一个力矩
  4. Rigidbody.AddRelativeTorque()
    相对自身坐标系,对刚体添加一个力矩
  5. Rigidbody.AddForceAtPosition()
    在物体表面添加一个力,相当于对物体施加了一个力和力矩
  6. Rigidbody.AddExplosionForce()
    对物体添加一个爆炸力,应用一种力到刚体来模拟爆炸效果,就是在爆炸力中心坐标,搜索在半径范围内的刚体,对其释放力的作用,超出半径范畴的刚体不受力的作用

2、 力的模式

  • Force: 添加一个可持续的力到刚体,使用它的质量。
  • Acceleration: 添加一个持续的加速度到刚体,忽略它的质量。
  • Impulse: 添加一个瞬间冲击力到刚体,使用它的质量。
  • VelocityChange: 添加一个瞬间速度给刚体,忽略它的质量。

五、Unity的生命周期安函数,分别在什么时候执行?

1、Editor

  • Reset()
    Reset是用户在Inspector面板上点击Reset按钮或首次添加组件的时候被调用,只在编辑器模式下被调用

2、Initialization

  • Awake()

    • Awake在加载脚本实例时被调用,一般在游戏开始前使用Awake来初始化变量或状态。
    • 在加载场景时初始化活动的GameObject的脚本实例时,或者将先前非活动的GameObject设置为活动时,或者使用Object.Instantiate创建Gameobject时,或则给活动状态的GameObject添加脚本时,都将调用Awake。
    • Awake是在所有对象初始化完成后调用的,并且每个对象上的Awake以随机的顺序被调用的。
    • Awake的调用和脚本实例的启用或禁用无关,和脚本实例挂载的游戏对象的状态有关。
    • Awake相当于构造函数,只会被调用一次。
  • OnEnable()

    在Awake之后调用,当游戏对象或脚本实例变为可用或激活状态时调用。

  • Start()

    • Start仅在Update函数第一次调用前调用,在生命周期中只会被调用一次。
    • Start总是在所有Awake函数执行完之后被调用。
    • Start和Awake不同的是,Start只在脚本实例启用的时候被调用,Start函数和脚本挂载对象与脚本实例的启用禁用有关。
    • 可以按需要调整延迟初始化代码,允许你协调初始化顺序。

Awake和Start相同点和不同点:

  1. Awake是在所有对象初始化完成,并且加载脚本实例的时候调用,Start是在Update第一次执行前调用,并且是在所有的Awake执行完成后调用。
  2. Awake函数的执行和脚本实例的是否启用无关,Start函数只有在脚本实例启用的时候才会调用。
  3. Awake不能充当协程,Start可以充当协程,可以按需延迟初始化代码 。
  4. Awake和Start在整个生命周期中只会被调用一次。

3、Physics

  • FixedUpdate()
    FixedUpdate为固定帧更新,主要用于物理更新,可设置帧步长,默认为0.02s。
  • OnTriggerEnte()
  • 当进入触发器时执行
  • OnTriggerStay ()
  • 当逗留触发器执行,每帧被调用
  • OnTriggerExit ()
  • 当退出触发器时执行
  • OnColissionEnter()
  • 当进入碰撞器时执行
  • OnColissionStay()
  • 当逗留碰撞器执行,每帧被调用
  • OnColissionExit()
  • 当退出碰撞器时执行

4、Input Event

  • OnMouseEnter()
    当鼠标进入UI元素或Collider时调用
  • OnMouseExit()
    当鼠标退出UI元素或Collider时调用
  • OnMouseDown()
    当在UI元素或Collider按下鼠标时调用
  • OnMouseUp()
    当在UI元素或Collider释放鼠标时调用
  • OnMouseDrag()
    当用户在UI元素或Collider按下并拖动时调用
  • OnMouseOver()
    当鼠标在UI元素或Collider上悬浮时调用
  • OnMouseUpAsButton()
    当在同一UI元素或Collider上按下鼠标,再松开时调用

5、Game Logic

  • Update()
    Update每帧更新,用于处理游戏的核心逻辑
  • LateUpdate()
    LateUpdate每帧更新,并且在所有Update执行完成之后执行
    可以将摄像机跟随放在这里,确保角色计算完毕后摄像机跟随,防止摄像机无法看到角色的现象。

6、Scene Rendering

  • Camera.OnPreCull()

    在裁剪计算相机剔除场景之前调用此函数

  • Object.OnBecameVisible()

    在对象对于任意相机可见时,调用该函数,在裁剪计算完成后,会触发对象可见性

  • Object.OnBecameInVisible()

    在对象对于任意相机不可见时调用该函数,在裁剪计算完成后,会触发对象可见性

  • Object.OnWillRenderObject()

    完成剔除过程后,如果对象可见,则为每个摄像机调用 OnWillRenderObject。

  • Camera.OnPreRender()

    在相机开始渲染场景之前调用此函数。

  • Camera.OnPostRender()

    在相机完成场景渲染后调用此函数。

  • Camera or Object.OnRenderObject()

    在完成所有常规场景渲染后调用此函数。此时,可使用 GL 类或 Graphics.DrawMeshNow 绘制自定义几何图形。

7、Gizmo Rendering

  • OnDrawGizmos()
    Editor调用, 用于在场景视图中绘制辅助图标以实现可视化。

8、GUI Rendering

  • OnGUI()
    每帧调用多次,用于响应GUI事件

9、Pausing

  • OnApplicationPause()
    当程序暂停时调用

10、Disable

  • OnDisable()
    当游戏对象或脚本实例变为不可用或未激活状态时调用,当游戏对象被销毁时也会执行

11、Decommissioning

  • OnDestroy()
    当将对象销毁时调用
  • OnApplicationQuit()
    在退出应用时调用

|-----------------------------------------------|
| TechX ------ 心探索、心进取! 每一次跌倒都是一次成长 每一次努力都是一次进步 |


END 感谢您阅读本篇博客!希望这篇内容对您有所帮助。如果您有任何问题或意见,或者想要了解更多关于本主题的信息,欢迎在评论区留言与我交流。我会非常乐意与大家讨论和分享更多有趣的内容。
如果您喜欢本博客,请点赞和分享给更多的朋友,让更多人受益。同时,您也可以关注我的博客,以便及时获取最新的更新和文章。
在未来的写作中,我将继续努力,分享更多有趣、实用的内容。再次感谢大家的支持和鼓励,期待与您在下一篇博客再见!

相关推荐
_oP_i1 小时前
Unity Addressables 系统处理 WebGL 打包本地资源的一种高效方式
unity·游戏引擎·webgl
鱼跃鹰飞4 小时前
大厂面试真题-简单说说线程池接到新任务之后的操作流程
java·jvm·面试
代码盗圣5 小时前
GODOT 4 不用scons编译cpp扩展的方法
游戏引擎·godot
程序员清风6 小时前
浅析Web实时通信技术!
java·后端·面试
测试19987 小时前
外包干了2年,快要废了。。。
自动化测试·软件测试·python·面试·职场和发展·单元测试·压力测试
mingzhi618 小时前
渗透测试-快速获取目标中存在的漏洞(小白版)
安全·web安全·面试·职场和发展
嚣张农民8 小时前
一文简单看懂Promise实现原理
前端·javascript·面试
Liknana10 小时前
Android 网易游戏面经
android·面试
Leoysq10 小时前
【UGUI】实现点击注册按钮跳转游戏场景
游戏·unity·游戏引擎·ugui
PandaQue12 小时前
《潜行者2切尔诺贝利之心》游戏引擎介绍
游戏引擎