Unity不挂载脚本至场景实现自动初始化

很多插件以及工具类,都会有一个初始化函数,需要在项目启动时手动调用,比较麻烦也提高了代码耦合性,Unity5.0以上的版本,针对这种情况,提供了新的特性RuntimeInitializeOnLoadMethodAttribute帮助自动初始化。

声明方式

特性共有六种参数声明方式,如下:

// 场景加载完毕调用 无参默认缺省值为AfterSceneLoad
[RuntimeInitializeOnLoadMethod]
// 场景加载完毕调用
[RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.AfterSceneLoad)]
// 场景加载前调用
[RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSceneLoad)]
// 所有程序集被加载和预加载资产被初始化后调用
[RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.AfterAssembliesLoaded)]
// 启动画面显示之前调用
[RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSplashScreen)]
// 子系统注册回调
[RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.SubsystemRegistration)]

示例

[RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.AfterSceneLoad)]
static void AfterSceneRuntimeOnLoadMethod()
{
    // 场景加载完毕后执行
    print("AfterSceneRuntimeOnLoadMethod");
}

[RuntimeInitializeOnLoadMethod]
static void RuntimeOnLoadMethod()
{
    // 场景加载完毕后执行(缺省值)
    print("RuntimeOnLoadMethod");
}

[RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSceneLoad)]
static void BeforeSceneRuntimeOnLoadMethod()
{
    // 场景加载前执行
    print("BeforeSceneRuntimeOnLoadMethod");
} 

Tip

  • Unity5.0以上的版本才具有此特性
  • 声明的函数必须是静态的,加上static关键字,由此引申出的用法如下:
    • 项目入口函数使用该声明自动调用
    • 工具类中处理与类对象无关的初始化函数用此声明,与类对象相关的初始化逻辑写在构造函数中
  • 函数的执行顺序如下:
    • 全局:SubsystemRegistration >> AfterAssembliesLoaded >> BeforeSplashScreen >> BeforeSceneLoad >> Awake >> Enable >> AfterSceneLoad >> Start
    • 同类同声明:按照定义顺序执行
    • 不同类同声明:无法确定具体顺序