realvirtual 初始化序列(Init Sequence)

Unity的默认执行顺序提供了初始化的坚实基础,但对于复杂场景来说,往往缺乏所需的精细控制——特别是当集成第三方解决方案、编排不同 GameObject 之间的序列事件或处理叠加场景加载时。为了解决这些挑战,realvirtual 引入了由 realvirtualController 管理的额外初始化序列。


概述

通过扩展 Unity的内置生命周期,realvirtual 确保在复杂的多场景项目中进行更可预测和逐步的设置过程。这对于协调第三方插件、自定义系统和多场景工作流之间的依赖关系特别有帮助。

扩展的生命周期增加了五个主要阶段:

  1. InitStart
  2. InitAwake
  3. InitEnable
  4. InitAllScenesLoaded
  5. InitPostAllScenesLoaded

每个阶段都是可选的;您只需要实现相应的接口或在脚本中重写提供的方法。

调试提示
您可以在 realvirtualController 上启用 DebugMode(例如,通过 Inspector)以查看详细的控制台日志,显示确切的调用序列。当您需要确认 InitStartInitAwakeInitEnableInitAllScenesLoaded 方法是否在预期时间运行时,这特别有用。

序列流程

  1. 场景加载 (Unity)
  2. realvirtualController 识别
  3. InitStart → InitAwake → InitEnable → (叠加场景加载) → InitAllScenesLoaded → InitPostAllScenesLoaded

以下是对每个阶段的详细介绍。


1. InitStart

  • 触发时机realvirtualController 首次被识别时。
  • 关键任务
    • 读取并应用任何保存的设置(例如来自 PlayerPrefsDebugModeConnectionMode)。
    • 调用实现 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 编排。

代码示例


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 IInitStartrealvirtualController 被识别后的最早时刻。用于读取配置或设置全局状态。
InitAwake IInitAwake与 Unity的 Awake() 配对,用于编排的初始化。
InitEnable IInitEnable与 Unity的 OnEnable() 配对,用于与激活相关的逻辑。
InitAllScenesLoaded IAllScenesLoaded确保所有场景(包括叠加场景)在继续之前加载完成。非常适合跨场景引用。
InitPostAllScenesLoadedInitAllScenesLoaded 中所有场景和逻辑之后的晚-晚初始化。