sh1’s diary

プログラミング、読んだ本、資格試験、ゲームとか私を記録するところ

Unity アプリケーションのエントリーポイントを作る

f:id:shikaku_sh:20200910152454p:plain:w400

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 という名前なので、シーンが切り替わるたびに呼び出されるようにも見えますが、そうではないようです。

f:id:shikaku_sh:20200911091436g:plain:h500
実行時だけ Log が出力される例

RuntimeInitializeOnLoadMethod 属性を付与したメソッドを1つだけにしておくことです。2つ以上になった場合、呼び出される順序を明示的に制御することができません。

Note: The execution order of methods marked [RuntimeInitializeOnLoadMethod] is not guaranteed.
Unity DOCUMENTATION - RuntimeInitializeOnLoadMethodAttribute

よって、通常は1つだけしか利用しないほうがよさそうです。(あとで、面倒がないの意味)


過去のログ

過去の情報を探すと、いろいろあって 2015 年ごろまでは、ちょうどよい回答がなかったようです。RuntimeInitializeOnLoadMethodAttribute メソッド自体は Unity 5 から追加されたようなので、それ以前の情報かどうかは区切りになっています。


参考

楽しく学ぶ Unity2D超入門講座

楽しく学ぶ Unity2D超入門講座

Unity ゲームエフェクト マスターガイド

Unity ゲームエフェクト マスターガイド

  • 作者:秋山 高廣
  • 発売日: 2019/07/19
  • メディア: 単行本(ソフトカバー)