RuntimeInitializeOnLoadMethod是否总会被执行?Unity技术咨询
关于Unity
RuntimeInitializeOnLoadMethod的执行规则与工作原理 核心结论
是的,只要标记了[RuntimeInitializeOnLoadMethod]特性的静态函数,无论所在类是否被实例化、是否被其他代码引用,都会在Unity指定的时机自动执行。你测试的代码里,哪怕把这个函数放在一个空的、从未被调用的类里,只要这个脚本在Unity项目的Assets目录下(或被打包进构建),就会触发执行。
工作原理详解
Unity的RuntimeInitializeOnLoadMethod是专门用于标记自动初始化逻辑的特性,它的执行逻辑如下:
- 自动扫描:Unity在启动游戏或加载场景时,会自动扫描所有已加载的程序集(包括项目脚本、引用的DLL),找出所有标记了该特性的静态函数。
- 可指定执行时机:通过
RuntimeInitializeLoadType参数可以精准控制执行时机,你代码中使用的AfterSceneLoad表示在场景加载完成后执行;其他常用时机包括:BeforeSceneLoad:场景开始加载前执行AfterAssembliesLoaded:所有程序集加载完成后、场景加载前执行BeforeSplashScreen:启动画面显示前执行
- 函数要求:被标记的函数必须是静态、无参数的,访问修饰符无论是
public还是private,Unity都能正常扫描并执行。
你的测试代码验证
你给出的代码:
using UnityEngine; [RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.AfterSceneLoad)] static public void AnyFunctionName() { Debug.Log("You always will see this msg"); }
每次加载场景都会显示日志,正是因为AfterSceneLoad的触发时机到了,Unity自动找到这个标记的静态函数并执行,和所在类是否被使用完全无关。
额外注意点
- 即使所在类是抽象类,只要标记了该特性的静态函数存在,依然会被执行。
- 如果多个函数标记了相同的
RuntimeInitializeLoadType,默认执行顺序不确定;Unity 2020.1及以上版本可通过特性的order参数指定优先级。 - 在Editor模式下进入Play模式时,这些函数也会触发;打包后的游戏中,每次启动或场景加载都会按指定时机执行。
内容的提问来源于stack exchange,提问作者Piter Carranza
相关产品推荐
相关产品推荐

