Unityの作法(初期化処理編)
アプリ制作終盤に起こってかなーり悩まされたのが、突然のエラーやUnityエディタのクラッシュ。主な原因は、初期化処理の順番を考慮せず、それぞれのオブジェクトでテキトーに初期化処理を記述していたために起こったもの。
基本的にUnityでは、シーンを生成したあとのオブジェクトの実行順は不定です。例えば、ゲーム進行を管理するマネージャークラスで背景の初期化を行うために、別のオブジェクトとして用意してある背景処理用オブジェクトを呼び出すとします。そのときに、背景処理用オブジェクトー>マネージャークラスと準備が終わっていれば問題ないですが、逆に実行された場合は、いろいろと不都合が起きる場合があります。
とりあえず、初期処理で悩まされないために以下の2つを覚えておけば、最低限の用は足りる模様。
Awake():オブジェクト生成直後に実行。このときは、他のオブジェクトの状況は不定なので、自身の初期処理だけをちゃんと行うようにする。
Start():オブジェクトの初期化は完了しているはずなので、他のオブジェクトと連携した初期化処理などは、この段階で行う。
詳細は、先人の知恵とマニュアルに習え。ということで、今度マニュアルも読んでおこう、、、。
あとUnityエディタがクラッシュしたときに、「これがクラッシュの原因か分からないけど、対応したら動くようになった」というのが、static変数の未初期化とシーンをまたいだオブジェクトでスクリプトの使い回し。
・static変数の未初期化
生成直後の値が不定だったstatic変数に適切な値を入れるようにしたら、ちゃんと動くようになったもの。そもそもの原因はそこじゃないような気がするんだけど、重要な変数はちゃんと初期化しておくようにしよう、という風に納得。
・シーンをまたいだオブジェクトでスクリプトを使い回す
これは、「そもそもそんな使い方するほうが間違ってる」的なもの。複数のシーンで共通の処理が必要なとき(フェードイン・アウトとかサウンドマネージャー的なもの)、通常ならどこからでも同じスクリプト処理を呼び出す、シングルトンというものを利用するのがスマートなやり方。開発当初、必要な作法らしいから、と情報を集めたけど、どうにも「いまいちわからん、、、」状態でした。
そこで、シーンそれぞれに用意しておけばいいんだろう、と単純な思考のもと、それぞれのシーンに同じオブジェクトを用意。ただ、利用しているスクリプトは、同じもの。要は使い回しです。
最初は特に問題なく動いていましたが、開発の終盤でのエディタクラッシュラッシュで、どうやらそのあたりのオブジェクトが怪しいらしいと判明。結局、シーンごとにスクリプトも用意し直して、安定して動作するようになりました。
これもまた、勉強しなきゃ、だ。