【Unity】一文了解生命周期


前言

又新开一个坑,这个系列主要是记录Unity的干货,就不像之前那几个有点口水话了233 当然我会改正

时隔半个月 经历了开学 换教室等等一系列杂七杂八的事情也算步入正轨了~

没杂七杂八的介绍什么,不水字数,直接开干!(暴论)


一、生命周期

编写顺序会严格按照真实的生命周期顺序 自上而下 具体图片请baidu

1. Editor (编译)

变量声明赋值

变量最终的值只看最后调用的方法,因为会逐步覆盖
变量声明并直接赋值>>检视面板赋值>>Awake>>OnEnable>>Start>>外部赋值(在其他脚本调用变量赋值)

我们一般对一个对象赋值,或者说想要从外部一个对象的属性或者成员变量的值进行更改的前提是:这个对象已经有了(意味着已经初始化Strart方法已经调用)所以外部赋值会后语Start方法进行调用

Reset()(重置)

初始化数值 用于角色等信息更改后初始化

  • 调用情况
    此函数只能在编辑器模式下(不运行)调用
  • 调用时间,次数与作用
    当脚本第一次挂载到对象或者使用了Reset命令之后调用。
    来初始化脚本的各个属性,Reset方法最常用于在检视面板中提供良好的默认值
  • 使用
    • 将脚本挂在物体上
    • 点击脚本右上角三个点 点击Reset 即可执行Reset命令,一般用于重赋值
      在这里插入图片描述

2. Initialization (初始化)

Awark()(唤醒)

从非激活状态转激活状态会调用一次 创建游戏物体后会调用一次 场景启动会调用一次

  • 调用情况
    • 在加载场景时初始化包含脚本的激活状态的GameObject时
    • GameObject从非激活转变为激活状态
    • 在初始化使用Instantite创建的GameObject之后
  • 调用时间,次数与作用
    • 在脚本实例的生存期内,Unity仅调用Awake-次。脚本的生存期持续到包含它的场景被卸载为止。
    • Unity调用每个Game0b ject的Awake的顺序是不确定的,人为干涉(即设计)来保证程序的正确性和稳定性
    • Awake 来代替构造函数进行初始化,在Unity这里,组件的初始化不使用构造函数

OnEnable (激活)

游戏物体被激活 调用
脚本组件被激活 调用

  • 调用情况
    • 游戏物体被激活
    • 脚本组件被激活
  • 调用时间,次数与作用
    • 重复赋值 变回初始状态

Start()(开始)

只会在首次和初次调用,且仅调用一次

  • 调用情况
    • 游戏物体被激活
    • 脚本组件被激活
  • 调用时间,次数与作用
    • 在脚本实例激活时在第一帧的Update之前被调用
    • 后与 Awake 执行,方便控制逻辑的前后调用顺序

外部赋值

如使用B类持有A类引用给其中变量赋值
如果在B类中的Start方法中赋值则顺序末知
因为不同类的相同初始化方法的执行顺序随机


3. Physis (物理检测)

FixedUpdate() (固定刷新)

每0.02秒嗲用一次,且早于Update

  • 调用情况
    • 游戏物体被激活
    • 脚本组件被激活
  • 调用时间,次数与作用
    • 每0.02秒嗲用一次,早于Update

yield WaitForFixedUpdate

暂时挂起直到固定更新执行一次

OnTriggerXXX (触发检测)

OnCollisionXXX (碰撞检测)


4. Input events (输入检测)

OnMouseXXX

鼠标输入检测


5. Game logic(游戏逻辑)

Update() (更新)

每帧调用

  • 调用情况
    • 游戏物体被激活
    • 脚本组件被激活
  • 调用时间,次数与作用
    • 每帧调用,是最常见用的函数,每秒调用60次左右(根据当前电脑的性能和状态)
    • 实时更新数据,接收输入数据

yield null (暂缓一帧,在下一帧接着往下处理)

这边

yield WaitForSeconds(协程等待的方法)

yield WWW (等待web请求完成(恢复为WaitForSeconds或null))

yield StartCoroutine (开启协程)

LateUpdate() (延迟更新)

一帧中 在Update之后调用 / 每帧的末尾被调用
例如摄像机移动,可以放在这,人物移动放在Update 因为摄像机大部分都是要比人物后移动

  • 调用情况
    • 游戏物体被激活
    • 脚本组件被激活
  • 调用时间,次数与作用
    • LateUpdate在调用所有Update函数后调用,每秒调用60次作用

6. Scene rendering (场景渲染)

OnWillRenderObject (即将渲染物体)

物体被当前场景的摄像机看见(不能是UI物体)调用

  • 调用情况
    • 如果对象可见并且不是 UI 元素,则为每个摄像机调用 OnWillRenderObject
    • 如果禁用了 MonoBehaviour,则不会调用该函数。
    • 该函数在剔除处理期间(即将渲染每个剔除的对象时)调用
    • 从 UI 元素调用时无效
  • 调用时间,次数与作用
    • 每帧将调用多次,调用频率目测和Update类似
  • 实验代码
    • 挂载到想被看见的物体上即可在这里插入图片描述

OnPreCull

``不好说 说什么的都有 有大佬知道可以留言 - 调用情况
- 在相机消隐场景之前被调用。
- `在相机开始渲染场景之前调用此函数。
- 该函数在剔除处理期间(即将渲染每个剔除的对象时)调用
- 这个函数仅用于宿主为摄像机的脚本。当此摄像机剔除了某个渲染场景时候触发此消息

  • 调用时间,次数与作用
    • 貌似渲染前还是渲染后都会调用

OnBecameVisible&OnBecameInvisible (即将课件&即将不可见)

表示当该物体上挂载的脚本中有这个函数时,进入当前摄像机渲染的画面时调用该函数

  • 调用情况

    • 在 Editor (编辑器)中运行时,Scene 视图摄像机也会导致调用该函数,如果物体已被该摄像机渲染则其他摄像机将无法触发调用
      在这里插入图片描述

    如图所示该物体(cube)已经被Scene 视图摄像机给渲染,调用了一次OnBecameVisible函数,当主摄像机(Main Camera)进入时则不再会触发,离开时也不会触发OnBecameInvisible函数

    • `缺少MeshRenderer组件或未激活则不会调用。
    • 场景中有个多摄像机,如果物体(cube)被其中一个摄像机给渲染则其余的摄像机再次进入也不会再次触发OnBecameVisible函数,离开时也不会触发OnBecameInvisible函数(跟1同理)
  • 调用时间,次数与作用

    • 渲染成功一次 离开一次

OnPreRender (即将渲染)

``Unity 在相机渲染场景之前调用的事件函数。 个人感觉编辑器环境下 Scene窗口已经渲染完成了 所以不能触发 个人拙见

OnPostRender (渲染完成)

``Unity 在相机渲染场景之后调用的事件函数。 个人感觉编辑器环境下 Scene窗口已经渲染完成了 所以不能触发 个人拙见
上述两个好像都要挂载到摄像机才执行

OnRenderImage

效果和上述一致
具体原理请参考这个播客(现在还太菜了=0=)

OnRenderImage原理


7.Gizmo rendering (自写工具类)

OnGrawGizmos(Gizmos渲染)

Gizmos一般是为开发者使用的,指的是开发时场景编辑器中所展示的那些相机、线框之类的物体。所以此方法里的内容一般不会需要发布到生产环境中。


8. Gui rendering(Gui渲染)

OnGUI (用户界面渲染的工作会在这一步执行。)


9. End of frame(结束帧)

yield WaitForEndOfFrame (协程:帧结束)

暂时挂起直到关闭窗口

当前帧彻底结束后会执行此协程。:


10. Pausing (暂停阶段)

OnApplicationPause (应用暂停)

应用暂停时会调用此方法,取消暂停后会从FixedUpdate开始重新执行。


11. OnDisable/Enable (脚本被禁用/激活)

游戏物体被禁用 调用
脚本组件被禁止 调用
游戏物体被销毁 调用

  • 调用情况
    • 游戏物体被禁用
    • 脚本组件被销毁
  • 调用时间,次数与作用
    • 满足调用情况时即时调用一次,用于一些对象的状态重置,资源回收与清理

12. Decommissioning (退出阶段)

OnDestroy (销毁)

场景或游戏结束/关闭 调用
脚本的删除 调用
挂载物体的删除 调用

  • 调用情况
    • 场景或游戏结束时
    • 停止播放模式将终止应用程序时
    • 网页视图关闭时
    • 当前脚本被移除时
    • 当前脚本挂载到的游戏物体被删除时
  • 调用时间,次数与作用
    • 满足调用情况时即时调用一次,用于一些游戏物体的销毁

OnApplicationQuit (程序退出)

程序退出 调用

  • 调用情况
    • 在程序退出之前所有游戏对象都会调用这个函数
    • 在编辑器中会在用户终止播放时
    • 在网页视图关闭时
  • 调用时间,次数与作用
    • 满足调用情况时即时调用一次,用于处理一些游戏退出后的逻辑

总结

刷了一遍API 发现自己还是有很多不懂的 图形渲染顺序和流程什么的;X
希望以后的我能将这篇文章继续更新,争取全部搞懂!

猜你喜欢

转载自blog.csdn.net/weixin_46172181/article/details/126917927