如何仅在 Unity 编辑器启动时运行脚本?

Posted

技术标签:

【中文标题】如何仅在 Unity 编辑器启动时运行脚本?【英文标题】:How to run a script only on Unity editor startup? 【发布时间】:2017-12-07 20:26:38 【问题描述】:

我正在为 Unity 编辑器编写自己的自动保存脚本,我希望它在启动编辑器时运行其设置方法。我试过使用 InitializeOnLoad,但它不仅在编辑器启动时调用静态构造函数,而且每次按下播放按钮时都会调用静态构造函数,再次初始化我的脚本并重置其所有计时器。

我尝试设置一个条件来仅在计时器的值设置为默认值时初始化脚本,但显然 InitializeOnLoad 创建了我的脚本的另一个实例,因此一切都被重置并且条件无用。

然后我考虑在启动时在编辑器首选项中创建一个 bool 来检查,当我按下播放时,脚本是否已经启动过。但是当编辑器关闭时我找不到重置这个值的方法,所以当我再次启动编辑器时,布尔值仍然为真,自动保存没有开始。

我也尝试使用 ExecuteInEditMode 来调用 OnDestroy 方法并将编辑器首选项设置为 false,但当然它仅在场景中附加到游戏对象的脚本实例时才有效,编辑器不是这种情况脚本。

有解决办法吗? 提前致谢。

【问题讨论】:

【参考方案1】:

在你的静态构造函数中使用这个:

if (!EditorApplication.isPlayingOrWillChangePlaymode) 
    //Do constructor stuff

【讨论】:

你不能这样做,因为你不能真正从另一个线程调用 Unity 的 API。正在从另一个线程调用 static 构造函数,所以我预计编辑器会出现 XXX is not allowed to be called from a MonoBehaviour constructor 异常。 我认为他正在使用一个简单的脚本,该脚本带有一个带有[InitializeOnLoad] 属性的纯类,它调用static ClassName() 构造函数。在这种情况下,他可以从构造函数内部调用EditorApplication 属性。脚本 ofc 不附加到任何游戏对象,该类不继承任何东西。 没错,作为一个编辑器脚本,只涉及一个线程,所以这完美地解决了我的问题。谢谢@Galandil。 哦,我明白了。脚本不附加到任何 GameObject 并且从无继承。这就是为什么 OP 发布代码是好的原因。+1 @ximera 你能详细说明你做了什么来解决你的问题吗?

以上是关于如何仅在 Unity 编辑器启动时运行脚本?的主要内容,如果未能解决你的问题,请参考以下文章

unity游戏启动如何调出

在 Unity 中,通过编辑器删除另一个组件时,如何通过脚本删除一个组件?

Unity3DUnity 脚本 ② ( Visual Studio 2019 中的 Unity 编译环境配置 | Unity 编辑器关联外部 C# 脚本编辑器 Visual Studio )

从编辑器启动时,在空调开发人员控制台中显示 Unity 场景的问题

Unity启动事件-监听:InitializeOnLoad

Unity3D设置使用VS2012做脚本编辑,但每次还是启动Monodevelop怎么办。