35.Unity中生命周期函数的设计
35.1 题目
Unity中的生命周期函数,为什么设计为反射调用,而不是通过继承重写生命周期函数的形式去实现呢?
35.2 深入解析
(说明:运行时由引擎按名称调度生命周期;是否实现为「反射」依版本与后端而异,面试可强调按名按需调用的设计动机。)
并非所有继承 MonoBehaviour 的类都需要使用所有生命周期函数。若用虚函数+基类默认空实现,则易产生大量空回调;按需只调用已定义的
Update/Start等,可避免无谓开销。Unity采用组件式设计,通过使用反射,可以将某些逻辑解耦,将组件的功能模块化,使得逻辑更加灵活和可复用。当触发一个生命周期时,需要通知相应 GameObject 的所有组件。如果使用继承多态来实现,则所有组件都要派生自包含对应生命周期的基类,或者是筛选出派生自此基类的组件逐一通知。这样一来容易带来复杂的继承关系,并且很麻烦,与组件式设计倡导的聚合代替继承的设计相悖。
插件与动态加载脚本只需挂载
MonoBehaviour并实现所需回调,无需统一继承某一深层基类,利于扩展。
35.3 答题示例
“Unity 通过引擎调度
MonoBehaviour的生命周期回调(如Awake/Update),而非要求开发者继承某一庞大基类并重写虚函数,主要考虑:
- 按需调用:只调度脚本里实际存在的方法,减少空回调;
- 组件化:各组件独立实现所需回调,聚合优于深层继承;
- 扩展性:第三方脚本与插件只需实现约定方法并挂载即可。”
35.4 关键词联想
- 生命周期反射调用
- 按需调用(Avoid Empty Calls)
- 组件式设计(Component-Based)
- 聚合优于继承
- 运行时扩展
- MonoBehaviour 回调
- 解耦合
- 第三方脚本支持
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com