欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【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命名空间。

【Unity】在编辑器下点击Play会立即运行的代码

将此属性添加到一个方法上,可以在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;
}
相关标签: 游戏引擎