Unity 5.0开始增加了RuntimeInitializeOnLoadMethodAttribute,这样就很方便在游戏初始化之前做一些额外的初始化工作,比如:Bulgy参数设置、SDK初始等工作。
先来看一下它的生命周期
sing UnityEngine; public class ExampleClass : MonoBehaviour { private void Awake() { Debug.Log( "Awake" ); } private void OnEnable() { Debug.Log( "OnEnable" ); } private void Start() { Debug.Log( "Start" ); } [RuntimeInitializeOnLoadMethod] private static void OnRuntimeMethodLoad() { Debug.Log( "RuntimeInitializeOnLoadMethod" ); } }
输出结果
而它还有两个属性:RuntimeInitializeLoadType.BeforeSceneLoad | RuntimeInitializeLoadType.AfterSceneLoad
using UnityEngine; public class InitTest : MonoBehaviour { [RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSceneLoad)] static void OnBeforeSceneLoadRuntimeMethod () { Debug.Log("Before scene loaded"); } void Awake() { Debug.Log("Awake"); } void OnEnable() { Debug.Log("OnEnable"); } [RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.AfterSceneLoad)] static void OnAfterSceneLoadRuntimeMethod() { Debug.Log("After scene loaded"); } [RuntimeInitializeOnLoadMethod] static void OnRuntimeMethodLoad() { Debug.Log("RuntimeMethodLoad: After scene loaded"); } void Start() { Debug.Log("Start"); } }
输出结果
Before –> Awake –> OnEnable –> After –> RuntimeMethodLoad –> Start。
附一张脚本的生命周期图(来源:官方网站)
Unity中提供的Attribute有很多,RuntimeInitializeOnLoadMethodAttribute只是其中的一种。如果自己写程序扩展编辑器的功能,就需要了解这些属性。常用的有:
1、AddComponentMenu 导航栏菜单
2、ContextMenu 右键菜单
3、HeaderAttribute
4、HideInInspector 可以让public变量在Inspector上隐藏,无法在Editor中进行编辑
5、MultilineAttribute 支持输入多行文本
6、RangeAttribute 限定输入值的范围
7、RequireComponent 组件依赖,使用该组件后自动添加依赖组件
8、RuntimeInitializeOnLoadMethodAttribute
9、SerializeField 强制对变量进行序列化,即使变量是private
10、SpaceAttribute 增加空位
11、TooltipAttribute 提示信息,当鼠标移到Inspector上时显示相应的提示
12、InitializeOnLoadAttribute
13、InitializeOnLoadMethodAttribute
14、MenuItem 导航栏的菜单项