Unity游戏引擎提供给开发者很多面板的自定义设置和配置,其中在c#脚本中引用一个特性[ExecuteInEditMode]就可以在游戏未运行的状态下执行c#脚步,对于开发者来说,这很方便调试。当前看看该特性下 代码在Start()和Update()函数中会的执行规律。
1.脚本如下(以下脚本均是在Unity 2020.1.0a12 (64-bit)编辑器下运行)
using UnityEngine; [ExecuteInEditMode] public class MyEditorScript : MonoBehaviour { void Start() { print("Start"); } void Update() { print("Update, time = " + Time.time); } }
2.将脚本拖拽到游戏体上,看看debug信息
Start()和Update()中只执行了一次。
3.我发现当我切换窗口然后再切回unity界面的时候,Update()执行了一次。
4.当我在场景中有任何修改的时候Update()也都执行了一次,其中包括重命名、创建物体、transform物体,enable/disable物体、保存修改等等均会发生。
5.有意思的是,当我disable脚本再enable脚本的时候,Start()并没有执行,只有Update()执行了一次,我继续在代码中添加Awake()函数,看看disable/enable之后,Awake()会不会执行。
using UnityEngine; [ExecuteInEditMode] public class MyEditorScript : MonoBehaviour { private void Awake() { print("Awake"); } void Start() { print("Start"); } void Update() { print("Update, time = " + Time.time); } }
(重新拖拽到物体上的debug信息)
遗憾的是Awake()并没有执行,Awake与Start()一样只在脚本拖拽到物体的时候才执行。
可能还有很多系统函数可以测试,不过我现在只测试了几个常用的系统函数,得出了以下总结。
总结:在编辑器模式下引用[ExecuteInEditMode]特性,Awake()、Start()、Update()在脚本首次拖拽到物体上的时候均执行一次,之后只有Update()在场景每次修改内容或者保存内容的时候执行一次。