[Unity]进入运行模式(PlayMode)细节

2021/01 23 20:01

启动了场景重载和域重域后,Unity启动运行模式的时序:

一、触发AssemblyReloadEvent beforeAssemblyReload 事件
二、C#域停止:
1.所有ScriptableObjets和MonoBehaviours调用OnDisable().
2.Unity等待所有异步操作完成.

三、所有 ScriptableObjets和MonoBehaviours的状态序列化
1.调用OnBeforeSerialize().
2.所有public和private字段被序列化, 但[NonSerialized]除外

四、托管包装器(Managed wrappers)和原生Unity对象断开

五、Unity子域(Child Domain)重载:
1.卸载Mono域
i.触发AppDomain.DomainUnload 事件
ii.销毁Unity子域.
* 调用GC和finalizers.
* 终止线程.
* 删除所有JIT信息.
2.创建新的Unity子域.


六、载入程序集(assemblies):
1.载入System程序集.
2.载入Unity程序集.
3.载入用户程序集.


七、初始化同步上下文(synchronization context).


八、恢复脚本状态.
1.重新创建所有Unity对象的可脚本化部分.
2.调用构造函数,给静态对象赋值.
3.所有Unity对象的状态反序列化:
i.所有可被序列化的Unity对象进行 恢复,并触发OnAfterDeserialize 事件
ii.调用 OnValidate().
iii.对所有使用了[ExecuteInEditorMode]属性的脚本执行:
* 调用 OnEnable()
* 调用 OnDisable()
* 调用 OnDestroy()


九、调用InitializeOnLoad and InitializeOnLoadMethod 方法
十、触发AssemblyReloadEvent afterAssemblyReload 事件