ゲームを作っているとき、ゲーム起動時にAwakeよりも早く初期化を行いたいことが起こることがあります。
今回はそんな場合に対応する方法と注意点と記載していきたいと思います。
コンテンツ
方法
方法はいたってシンプル
匿名希望の英雄で使用している具体例は以下の通りです。
public class BootScene : MonoBehaviour
{
[SerializeField]
private eSceneName m_startScene = eSceneName.Title;
[RuntimeInitializeOnLoadMethod()]
static void Init()
{
//シーン切替 .
SceneManager.LoadScene(eSceneName.Boot.ToString());
}
void Awake()
{
Application.targetFrameRate = 60;
FadeManager.Instance.LoadScene(m_startScene, 0f);
}
}
具体的にはここです
[RuntimeInitializeOnLoadMethod()]
static void Init()
{
//シーン切替 .
SceneManager.LoadScene(eSceneName.Boot.ToString());
}
staticの関数の上にこれをつけるだけです。
[RuntimeInitializeOnLoadMethod()]
これをつけることで Init() アプリ起動時に真っ先に実行されるようになります。
動作の説明
ちなみにこのスクリプト 「BootScene 」はこの通り
Bootというシーンのコンポーネントにセットされてます。
この 「BootScene 」 の挙動は
- ゲームが起動時にInitが実行される
- Initという処理内で Bootという名前のシーンが読み込まれる
- 「BootScene」のAwakeが呼び出される
- Awakeでフレームを60FPSに固定しインスペクターで設定したシーンが読み込まれる
(この場合はTitleですね)
要約すると。
アプリ起動時にUnityの60FPSに固定した上でタイトルを表示する。
やってることはかなりシンプルですが、あらかじめこうした処理をつけておくと
- アプリ起動に何かのアカウントにログイン
- ボリュームの初期化
- 起動前の改ざんチェック
等々の処理をひとまとめに記載できるようになるので非常に便利かと思われます。
デメリットもしくは非推奨事項
便利な機能ですが、絶対にお勧めできない方法アあります。
それは
[RuntimeInitializeOnLoadMethod()]
これを乱用しないことです。むしろ一つだけにする
これが複数あると非常に面倒なことになります。
例えば、以下のようなことになるとどのシーンに飛ぶでしょうか?
絶対にまねはしてはいけない!
[RuntimeInitializeOnLoadMethod()]
static void Init()
{
//シーン切替 .
SceneManager.LoadScene(eSceneName.Boot.ToString());
}
[RuntimeInitializeOnLoadMethod()]
static void Init()
{
//シーン切替 .
SceneManager.LoadScene(eSceneName.Title.ToString());
}
正直見当もつきません。
ですのでこのような不確定な要素は追加しないようにしましょう。
まとめ
アプリ起動前に処理を追加する場合、
非常に便利な機能で、いろいろ応用が利くので必要な場合は使用していくべきですが、
絶対に一つだけにしましょう。
コメントを残す