Unity のプログラムを作成していて、ゲーム全体を通して一番最初に実行される(通常の条件で最初に実行させる)メソッドを使いたいときがあると思います。
他のものでたとえると、C++ や C# の Main() メソッドのようなものです。WPF でも Application.Run() の OnStartup() があります。
なんらかの初期化をするときに使いたくなる、というのがわかりやすい。「Unity Mobile Notifications Package」を利用しているなら、一番最初にチャンネルを登録(生成)するなど、アプリケーションを開始したタイミングで1回だけ実行し、Loading 画面を必要としない(読み込みに時間がかからない)ようなものが該当するのだと思います。
RuntimeInitializeOnLoadMethodAttribute
今のところの推奨はこれみたいです。
RuntimeInitializeOnLoadMethod
属性は、引数のパラメーターを RuntimeInitializeLoadType.BeforeSceneLoad
にすると MonoBehaviour クラスの継承クラスの持つ Awake
メソッドより早く実行されます。
これは、MonoBehaviour を継承しないクラスでも実行されます。ポイントは、static メソッドに使う属性になります。
using UnityEngine; public class App { [RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSceneLoad)] public static void EntryPoint() { Debug.Log("EntryPoint Called."); } }
個人的に、(エントリーポイントを含んでいる)クラスの名前は App か Application が好きです。ファイルの並びでも上のほうにくるので、エントリーポイントが迷子になりません。
注意
RuntimeInitializeLoadType.BeforeSceneLoad
という名前なので、シーンが切り替わるたびに呼び出されるようにも見えますが、そうではないようです。
RuntimeInitializeOnLoadMethod 属性を付与したメソッドを1つだけにしておくことです。2つ以上になった場合、呼び出される順序を明示的に制御することができません。
Note: The execution order of methods marked [RuntimeInitializeOnLoadMethod] is not guaranteed.
Unity DOCUMENTATION - RuntimeInitializeOnLoadMethodAttribute
よって、通常は1つだけしか利用しないほうがよさそうです。(あとで、面倒がないの意味)
過去のログ
過去の情報を探すと、いろいろあって 2015 年ごろまでは、ちょうどよい回答がなかったようです。RuntimeInitializeOnLoadMethodAttribute
メソッド自体は Unity 5 から追加されたようなので、それ以前の情報かどうかは区切りになっています。
- Unity questions - The application entry point
- Unity questions - Where is the entry point for a C# application?
- stack overflow - Is it possible to call a function on Unity Program Start?
参考
- のらくるノート - 【Unity】どのシーンから起動しても共通の初期化を呼び出したい
- yotiky Teck Blog - エントリーポイントを探してUnityの森を彷徨う
- kanのメモ帳 - Unityのエディタ拡張時に非同期タスクの進捗状況を表示する Progress【Unity】【エディタ拡張】
- テラシュールブログ - もっと楽なシングルトンの実装
- テラシュールブログ - ゲームの起動後 Awakeより前にメソッドを実行する
- 作者:秋山 高廣
- 発売日: 2019/07/19
- メディア: 単行本(ソフトカバー)