realvirtual 初始化序列(Init Sequence)
Unity的默认执行顺序提供了初始化的坚实基础,但对于复杂场景来说,往往缺乏所需的精细控制——特别是当集成第三方解决方案、编排不同 GameObject 之间的序列事件或处理叠加场景加载时。为了解决这些挑战,realvirtual 引入了由 realvirtualController 管理的额外初始化序列。
概述
通过扩展 Unity的内置生命周期,realvirtual 确保在复杂的多场景项目中进行更可预测和逐步的设置过程。这对于协调第三方插件、自定义系统和多场景工作流之间的依赖关系特别有帮助。
扩展的生命周期增加了五个主要阶段:
- InitStart
- InitAwake
- InitEnable
- InitAllScenesLoaded
- InitPostAllScenesLoaded
每个阶段都是可选的;您只需要实现相应的接口或在脚本中重写提供的方法。

调试提示
您可以在 realvirtualController 上启用 DebugMode(例如,通过 Inspector)以查看详细的控制台日志,显示确切的调用序列。当您需要确认 InitStart、InitAwake、InitEnable 和 InitAllScenesLoaded 方法是否在预期时间运行时,这特别有用。
序列流程
- 场景加载 (Unity)
- realvirtualController 识别
- InitStart → InitAwake → InitEnable → (叠加场景加载) → InitAllScenesLoaded → InitPostAllScenesLoaded
以下是对每个阶段的详细介绍。
1. InitStart
- 触发时机:realvirtualController 首次被识别时。
- 关键任务:
- 读取并应用任何保存的设置(例如来自
PlayerPrefs的DebugMode、ConnectionMode)。 - 调用实现
IInitStart接口的任何脚本。
- 读取并应用任何保存的设置(例如来自
代码示例
using realvirtual;
using UnityEngine;
public class MyInitStartExample : MonoBehaviour, IInitStart
{
public void OnInitStart()
{
// 执行基本设置,例如从 PlayerPrefs 加载配置
Debug.Log("InitStart: Essential setup complete.");
}
}
2. InitAwake
- 触发时机:realvirtualController 的标准 Awake 方法被调用时。
- 关键任务:
- Unity的标准
Awake()可能在此之前或之后发生,取决于 Unity的内部顺序。 - 使用
IInitAwake进行额外的初始化逻辑,这些逻辑应与 Unity的 Awake 配对,但由 realvirtualController 编排。
- Unity的标准
代码示例
using realvirtual;
using UnityEngine;
public class MyInitAwakeExample : MonoBehaviour, IInitAwake
{
public void OnInitAwake()
{
// 执行类似 Awake 的设置,例如引用或数据初始化
Debug.Log("InitAwake: More initialization logic here.");
}
}
3. InitEnable
- 触发时机:realvirtualController 启用时(类似于 Unity的
OnEnable())。 - 关键任务:
- 标准的
OnEnable()可能在此之前或之后发生,同样取决于 Unity的内部顺序。 - 无论从
realvirtualBehavior派生的脚本(或其 GameObject)的活动状态如何,此方法仍会被调用。
- 标准的
代码示例
using realvirtual;
using UnityEngine;
public class MyInitEnableExample : MonoBehaviour, IInitEnable
{
public void OnInitEnable()
{
// 设置与激活相关的逻辑,例如附加事件监听器
Debug.Log("InitEnable: Components are ready to be enabled.");
}
}
4. InitAllScenesLoaded
- 触发时机:所有场景(包括叠加场景)已加载完成时。
- 关键任务:
- 如果没有加载额外场景,此方法在
InitEnable之后立即运行。 - 通常用于最终的跨场景引用,或启用/禁用依赖于每个场景就绪的系统。
- 实现
IAllScenesLoaded或在realvirtualBehavior中重写OnAllScenesLoaded。
- 如果没有加载额外场景,此方法在
代码示例
using realvirtual;
using UnityEngine;
public class MyAllScenesLoadedExample : realvirtualBehavior, IAllScenesLoaded
{
public void OnAllScenesLoaded()
{
// 跨多个场景访问对象,完成跨场景引用等
Debug.Log("All Scenes Loaded: Multi-scene references can now be set up.");
}
// 如果在 realvirtualBehavior 中重写,也可以:
// protected override void OnAllScenesLoaded() { ... }
}
5. InitPostAllScenesLoaded
- 触发时机:紧接在
InitAllScenesLoaded之后。 - 关键任务:
- 允许"晚-晚"初始化逻辑——当您希望确保
InitAllScenesLoaded中(包括其他脚本的)所有内容都已完成时。
- 允许"晚-晚"初始化逻辑——当您希望确保
多阶段示例
以下是一个通过实现多个接口处理多个阶段的脚本示例:
using UnityEngine;
using realvirtual;
public class MyMultiStageScript : MonoBehaviour,
IInitStart,
IInitAwake,
IInitEnable,
IAllScenesLoaded
{
public void OnInitStart()
{
Debug.Log("OnInitStart: Reading configuration...");
}
public void OnInitAwake()
{
Debug.Log("OnInitAwake: Setting up references...");
}
public void OnInitEnable()
{
Debug.Log("OnInitEnable: Attaching event listeners...");
}
public void OnAllScenesLoaded()
{
Debug.Log("OnAllScenesLoaded: Final cross-scene linking...");
}
}
可自定义方法摘要
| 方法 / 接口 | 描述 |
|---|---|
InitStart IInitStart | realvirtualController 被识别后的最早时刻。用于读取配置或设置全局状态。 |
InitAwake IInitAwake | 与 Unity的 Awake() 配对,用于编排的初始化。 |
InitEnable IInitEnable | 与 Unity的 OnEnable() 配对,用于与激活相关的逻辑。 |
InitAllScenesLoaded IAllScenesLoaded | 确保所有场景(包括叠加场景)在继续之前加载完成。非常适合跨场景引用。 |
| InitPostAllScenesLoaded | InitAllScenesLoaded 中所有场景和逻辑之后的晚-晚初始化。 |