【Unity】在编辑器下点击Play会立即运行的代码
程序员文章站
2024-03-25 16:50:46
...
问题
如果点击Play之后有一些代码执行了,而你又完全找不到调用者。
那么,作者很有可能使用了以下的这些小技巧,它们的特点是只要进入Playmode就会自动执行。
Unity的InitializeOnLoad属性
有时,若能够在 Unity 启动时立即在项目中运行一些 Editor 脚本代码而无需用户进行操作,这会很有用处。
为实现此目的,可将InitializeOnLoad
属性应用于具有静态构造函数的类。静态构造函数是一个与类同名的函数,声明为 static,没有返回类型或参数。
代码示例如下:
using UnityEngine;
using UnityEditor;
[InitializeOnLoad]
public class Startup {
static Startup()
{
Debug.Log("Up and running");
}
}
UnityEditor.Callbacks的PostProcessScene属性
PostProcessSceneAttribute
位于UnityEditor.Callbacks
命名空间。
将此属性添加到一个方法上,可以在building Scene之后进行回调。当进入Playmode, SceneManager.LoadScene被调用的时候也会调用一次这个回调函数。
所以就会表现出,无论在编辑器下点开哪个场景,都会执行一次添加了此属性的方法。
PostProcessSceneAttribute 可以被添加到多个方法上,如果希望它们按照特定顺序执行,可以向此属性添加一个参数,默认从0开始。回调函数将按照此参数的顺序执行。
代码示例如下:
// C# example:
// Automatically creates a game object
// with a primitive mesh renderer and appropriate collider.
using UnityEngine;
using UnityEditor;
using UnityEditor.Callbacks;
public class MyScenePostprocessor {
[PostProcessSceneAttribute (2)]
public static void OnPostprocessScene() {
GameObject cube = GameObject.CreatePrimitive(PrimitiveType.Cube);
cube.transform.position = new Vector3(0.0f, 0.5f, 0.0f);
}
}
检测Playmode的变化
我们可以在进入Playmode或者退出Playmode的时候执行一些代码。
代码示例如下:
[InitializeOnLoad]
public static class Startup {
static Startup () {
EditorApplication.playModeStateChanged += EditorApplication_playModeStateChanged;
}
private static void EditorApplication_playModeStateChanged(PlayModeStateChange obj) {
//ExitingPlayMode
if (obj == PlayModeStateChange.ExitingPlayMode) {
isStoppingPlaying = true;
}
//EnteredPlayMode
if (obj == PlayModeStateChange.EnteredPlayMode)
isStoppingPlaying = false;
}
public static bool isStoppingPlaying;
}