web-dev-qa-db-ja.com

Unity Program Startで関数を呼び出すことは可能ですか?

Unityで、あるシーンでプログラムを開始すると、最初に関数を起動する方法があるのだろうかと思っていました。どのシーンにいても、この1つの関数を機能させたいと付け加えなければなりません。つまり、単純なStart関数です。それをカットしません。 Unityでこれが可能かどうかわかりませんか?

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

RuntimeInitializeOnLoadMethodAttribute あなたを助けることができます:)

using UnityEngine;

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

プレハブを使用します_ AppStartupこれはスクリプトを持つ空のゲームオブジェクトですAppStartup。これをすべてのシーンにドラッグし、@ maZZZuが述べたように最初に実行されるようにAppStartupを構成します。

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
        }
    }
    

したがって、必要なのは、このプレハブをすべてのシーンに手動でドラッグして、-1またはスクリプトの実行順序で指定することだけです。特にプロジェクトが成長し、事前定義されたシーンフローに依存している場合は、時間と手間を大幅に節約できます。

3
Kay

ここでは、すべての関数の実行順序を1つにまとめることができます: http://docs.unity3d.com/Manual/ExecutionOrder.html

Awakeは、スタンドアロンアプリケーションで実行される最初の関数です。実行するには、GameObject関数を含むスクリプトが添付されたAwakeが必要です。シーンに関係なく実行したい場合は、これをすべてのシーンに追加する必要があります。

あなたはまだあなたのゲームのスタートアップシーンが何であるかを決定する必要があります。したがって、プログラムの開始時に実際に実行したい場合は、そこにGameObjectを追加するだけで十分です。

2
maZZZu

はい...

メソッドを[RuntimeInitializeOnLoadMethod]で飾ります。

シーンの読み込みが完了するとすぐに呼び出されます(Awakeイベントの後)。

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

ドキュメント: https://docs.unity3d.com/ScriptReference/RuntimeInitializeOnLoadMethodAttribute.html

0
Basic