我想知道在Unity中是否有一种方法,当我在场景上启动我的程序时它首先触发一个函数,我应该补充一点,我希望这个函数无论我在哪个场景都能工作。所以a简单的启动功能不会削减它。不确定Unity中是否可以这样做?
public void ProgramBegins()
{
//FIRES FIRST ON ANY SCENE
//DO STUFF
}
答案 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