Unity ExecuteInEditMode详解
Unity里继承MonoBehaviour的脚本,并不是一直都会执行的。Unity默认只有在Play模式下,游戏当前运行场景里的GameObject挂载的脚本才会执行,也就是说,我们必须按下Play按钮进入游戏,上述脚本才会执行。Unity还有另外的两种模式:Edit Mode和Prefab Mode,Edit Mode就是正常的Unity编辑状态,Prefab Mode是进入Prefab对其进行编辑时对应的模式。
为了满足使用的需求,Unity支持通过[ExecuteInEditMode]
或[ExecuteAlways]
两种参数使脚本在Play Mode以外的状态下被执行,[ExecuteEditMode]
支持脚本在Edit Mode下运行,[ExecuteAlways]
是在Unity2018.3及以后的版本新加入的功能,能够支持脚本一直运行。(ps:由于[ExecuteInEditMode]
并没有考虑Prefab Mode,严格意义上讲Prefab Mode也属于Edit Mode,所以这个功能会逐渐被Unity弃用,最后应该会被[ExecuteAlways]
所替代)
两种的写法是差不多的,只需要在对应脚本的类前加上对应代码即可,如下所示,
[ExecuteInEditMode]
public class Example1 : MonoBehaviour {
...
}
[ExecuteAlways]
public class Example2 : MonoBehaviour {
...
}
ExecuteInEditMode
值得注意的是,与PlayMode不同的是,函数并不会不停的执行。
Awake
和Start
:加载时调用,也就是脚本赋给物体的时候被调用Update
: 只有当场景中的某个物体发生变化时,才调用,当进程切出去再回来,也会调用一次。OnGUI
: 当GameView接收到一个Event时才调用。OnRenderObject
和其他的渲染回调函数 : SceneView或者GameView重绘时,比如,一直移动鼠标的时候OnRenderObject
会被调用。
使用了[ExecuteAlways]
参数的类,仍然可以在原来的Play Mode下正常运行,举个例子,如下图所示:
[ExecuteInEditMode]
public class TestA : MonoBehaviour
{
private void Awake()
{
Debug.Log(1);
}
private void Start()
{
Debug.Log(2);
}
private void Update()
{
Debug.Log(3);
}
}
在Edit Mode下,将其挂载到一个GameObject下,会打印如下消息:
运行游戏,可以看到又调用了一次Awake和Start函数:
关闭游戏,回到Edit Mode:
ExecuteAlways
ExecuteAlways
可以看作是ExecuteInEditMode
的改进版,支持Prefab Mode下的脚本调用,其余的与ExecuteInEditMode
基本完全相同,具体代码如下:
[ExecuteAlways]
public class Example : MonoBehaviour {
void Start()
{
if (Application.IsPlaying(gameObject))
{
// 若在Play Mode下
// Play logic
}
else
{
// 若在Edit Mode下
// Editor logic
}
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)