是否可以在Unity Program Start上调用函数?

时间:2015-02-25 05:14:28

标签: c# unity3d

我想知道在Unity中是否有一种方法,当我在场景上启动我的程序时它首先触发一个函数,我应该补充一点,我希望这个函数无论我在哪个场景都能工作。所以a简单的启动功能不会削减它。不确定Unity中是否可以这样做?

public void ProgramBegins()
{
    //FIRES FIRST ON ANY SCENE
    //DO STUFF
}

4 个答案:

答案 0 :(得分:21)

RuntimeInitializeOnLoadMethodAttribute可以帮助您:)

using UnityEngine;

class MyClass
{
    [RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSceneLoad)]
    static void OnBeforeSceneLoadRuntimeMethod()
    {
        Debug.Log("Before scene loaded");
    }
}

答案 1 :(得分:3)

我使用预制件 _AppStartup ,它只是一个具有脚本 AppStartup 的空游戏对象。在每个场景中拖动它并将AppStartup配置为像@maZZZu所说的那样首先执行。

AppStartup执行以下作业:

  • 应用启动时的全局初始化任务
  • 如果在编辑器模式下启动任意场景,则切换到启动场景
  • 场景特定的初始化任务

    public class AppStartup : MonoBehaviour 
    {
        const int bootSceneNo = 0;
    
        public static bool veryFirstCallInApp =  true;
    
        void Awake ()
        {
            if (veryFirstCallInApp) {
                ProgramBegins ();
                if (Application.loadedLevel != bootSceneNo) {
                    // not the right scene, load boot scene and CU later
                    Application.LoadLevel (bootSceneNo);
                    // return as this scene will be destroyed now
                    return;
                } else {
                    // boot scene stuff goes here
                }
            } else {
                // stuff that must not be done in very first initialisation but afterwards
            }
            InitialiseScene ();
            veryFirstCallInApp = false;
            DestroyObject (gameObject);
        }
    
        void ProgramBegins()
        {
            // code executed only once when the app is started
        }
    
        void InitialiseScene ()
        {
            // code to initialise scene
        }
    }
    

所以你要做的就是手动将这个预制件拖到每个场景中,并在脚本执行顺序中给它 -100 或其他任何东西。特别是当项目增长并依赖于预定义的场景流时,它将为您节省大量时间和麻烦。

答案 2 :(得分:2)

在这里,您可以找到统一的所有功能的执行顺序:http://docs.unity3d.com/Manual/ExecutionOrder.html

Awake是在独立应用程序中执行的第一个函数。要运行它,您需要有GameObject附加脚本,其中包含Awake函数。如果您希望它在任何场景下运行,则应将其添加到每个场景中。

您仍需要确定游戏的启动场景。因此,如果你真的希望它只是在程序的开头运行就足以在那里添加GameObject

答案 3 :(得分:0)

是的...

[RuntimeInitializeOnLoadMethod]装饰您的方法。

场景加载完成后(在Awake事件之后)将立即调用它。

[RuntimeInitializeOnLoadMethod]
static void OnRuntimeMethodLoad() {
    Debug.Log("After Scene is loaded and game is running");
}

文档:https://docs.unity3d.com/ScriptReference/RuntimeInitializeOnLoadMethodAttribute.html