はじめに
Unityを使っているとしばしば作業中のシーンから実行したい時がありますよね?
しかし、必ず行わなければならい初期化などがある場合、作業中のシーンから実行できない!
なんて事はないでしょうか?
この問題はRuntimeInitializeOnLoadMethodというアトリビュート(関数などに付けられる属性のこと)を使うと解決することができます。
難しいそうですが、すごく簡単なので安心してください!
RuntimeInitializeOnLoadMethodとは?
任意の関数に[RuntimeInitializeOnLoadMethod]属性を付けると、ゲーム開始時に実行してくれます。
using UnityEngine;
public class Test
{
[RuntimeInitializeOnLoadMethod]
static void Init()
{
new GameObject ("Test");
}
}
上記の内容を書いた後に実装すると、以下のようにTestというゲームオブジェクトが追加されます。
ちなみに、このメソッドはMonoBehaviourを継承しなくても大丈夫です。
つまり、このクラスを持ったオブジェクトをシーン上に配置していなくてもゲームを開始するとこの関数が呼び出されます。
また、GameObjectが生成できたように、UnityのAPIを呼び出すことが可能です。
とっても便利ですね!
RuntimeInitializeOnLoadMethodの実行タイミング
RuntimeInitializeOnLoadMethodを指定した関数はデフォルトではOnEnableの後に実行されます。
RuntimeInitializeLoadType.BeforeSceneLoadという引数を設定するとAwakeの前に実行させることもできます。
using UnityEngine;
public class Test
{
[RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSceneLoad)]
static void Init()
{
new GameObject ("Test");
}
}
共通の初期化処理を作る
初期化用のシーンとスクリプトを作成しましょう。
今回はStartup.csとStartupシーンという名前にしました。
Startupスクリプトは以下のようにとてもシンプルです。
code:c#
using UnityEngine;
using UnityEngine.SceneManagement;
public class Startup
{
[RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSceneLoad)]
static void RuntimeInitialize()
{
//Startupシーン読み込む
SceneManager.LoadScene("Startup", LoadSceneMode.Additive);
}
}
LoadSceneの第二引数がLoadSceneMode.Additiveになっていることだけ注意しましょう。
追加シーンとして読み込まないと現在のシーンが上書きされてしまいます。
あとはBuildSettingsのScenesInBuildにStartupシーンを追加するだけです。
まずは先ほど作成したStartupシーンを開きます。
そして、Unityの左上のメニューからBuildSettingsウィンドウを開きます。
AddOpenScenesをクリックします。
するとBuild対象に追加されます。
この時Startupシーンが一番最後に来るようにしてください。(一番下になっていなかったら、ドラッグすると動かせます)
以上で準備完了です!
これでStartupシーンに必要オブジェクトを配置すると、そのオブジェクトはどのシーンからでも読み込まれるようになります。
注意点
注意点としては、起動シーンのAwakeでStartupシーンのオブジェクトを参照する事はできません。
理由は実行順番にあります。
今回の実装でゲーム実行すると以下の順番で処理が走ります。
- RuntimeInitializeOnLoadMethodの処理
- 起動したシーンのAwake
- StartupシーンのオブジェクトAwake
- 起動したシーンのOnEnable
- StartupシーンのOnEnable
- 起動したシーンのStart
- StartupシーンのStart
起動シーンのほうが先に実行されるため、AwakeでStartupシーンを参照する事はできません。
基本的にStartで参照する分には問題ないので、Startで呼び出すようにしましょう。
まとめ
以上が共通の初期化処理を実行する方法でした。
実装も簡単で便利なので、呼び出し順にだけ注意して使っていきましょう。
全体で使うマネージャークラスやデバッグ用のクラスなどを配置する場所としてとて活用できると思います!
コメント