
ゲーム開発ログ #210 Unity: Start() を IEnumerator Start() に変えた話
Unityでカジュアルゲームを作っています。
スキやフォロー、ありがとうございます。励みになります。
今回は、
Scene間の処理に伴い一部のStart() をIEnumerator Start() に変えた話です。
自分用メモとして残しておきます。
直面した問題
Scene間をまたいでの初期化処理などの改修を行っていた
初期化の処理を独立させたことで、これまでの初期化の順番が保証されなくなった
そのため、初期化処理で「ある処理が完了するまで待つ」という処理が必要になった
調べてわかったこと
Start()には、void Start()のほかに、コルーチンとして実行するIEnumerator Start()があることが分かりました。
通常のコルーチンは、実行するためにStartCoroutine()を使う必要があります。
一方、IEnumerator Start()の場合は、UnityがStart()をコルーチンとして扱うため、自分でStartCoroutine()を呼び出す必要がないようです。
最終的な対処
今回は、初期化の順番が従来から変わったことでエラーが出ていたので、
イメージとしては、従来の
void Start()
{
クラスAの初期化処理
}を
IEnumerator Start()
{
// クラスAの初期化が完了するまで待つ
while (!クラスA.IsInitialized)
{
yield return null;
}
クラスAの初期化処理
}のような形にして、必要な初期化が完了するまで待ってから処理を進められるように対応しました。
気づき(自分用メモ)
Start()はUnityのライフサイクルイベントなので、特殊な扱いがある
IEnumerator Start()とすることで、StartCoroutine()を自分で呼び出さなくても、Start()自体をコルーチンとして実行できる
初期化処理では、単純に実行順を決めるだけでなく、必要な処理が完了するまで待つ方法もある
まとめ
今回は、問題をきっかけにIEnumerator Start()の存在を知ることができた
普段使っていた機能でも、まだ知らないバリエーションがあった
今回の改修処理では効果的に使えそうなので、活用して初期化処理全体の安定化を進めたいと思う
※あくまで自分用のメモです。勘違いや不正確な部分が含まれる可能性があります。
※日々の作業を書いているため過去の内容と酷似する場合があります。
次にやること
引き続きSceneをまたいで使用するデータの管理方法を整理
初期化部分の組みなおし
データの読み込み済み状態を管理する仕組みの追加
引き続き、チェック作業と開発を進めていきます。