Unityスプラッシュスクリーンが起動しているときに、データをバックグラウンドでロードできますか?もしそうなら、どうですか?
アセットをロードするだけでなく、スプラッシュスクリーン中にコードを実行しようとしています。
GoogleやUnityのドキュメントでこれに関する情報を見つけることができませんでした。
Unityスプラッシュスクリーンが起動しているときに、データをバックグラウンドでロードできますか?もしそうなら、どうですか?
アセットをロードするだけでなく、スプラッシュスクリーン中にコードを実行しようとしています。
GoogleやUnityのドキュメントでこれに関する情報を見つけることができませんでした。
回答:
いくつかのテストを実行したところ、スプラッシュスクリーンが表示されている間に、最初のシーンのオブジェクトのコンストラクターが実際に呼び出されることがわかりました。
静的なストップウォッチで測定したタイミングは次のとおりです。
Constructed 0 s
Awake 2.118 s
OnEnable 2.12 s
Start 2.744 s
First Update 2.919 s
したがって、スプラッシュスクリーンが終了する3秒近く前に(デフォルト設定で)スクリプトをトリガーして、コンストラクターからスクリプトを起動できるように見えます。そこから(おそらく独自のスレッドで)ロードコードをトリガーしてみることができます。
これはおそらく読み込みスレッドから呼び出されていることに注意してください。メインスレッドではないので、ここで許可されていることはもう少し制限されます。ロードスレッドでサポートされていない特定のことを実行しようとしている場合は、アプリケーションの詳細を記載した新しい質問を投稿することを検討してください。その場合の回避策を見つけることができます。
Update()
、コンストラクターが起動してから2.9秒後にスクリプトが最初のティックを取得します。これで、現在の装置で識別できることはほぼすべてです。
最善の策は、独自のロード画面を作成し、それを最初のシーンとして設定することです。次に、その単純なシーンから、シーンマネージャを使用して、バックグラウンドで次のシーンを非同期的にロードします。
これを確認するための情報は見つかりませんが、私の観察から、スプラッシュスクリーンが表示されている間にUnityが最初のシーンをロードしているようです。
一部のプラットフォームでは、ロードが十分に速い場合、スプラッシュスクリーンが消える前にゲームが実行を開始します。
これはすべて、いつでも、どのプラットフォームでも、どのバージョンのアップデートでも変更できます。これが一貫している保証はないので、独自のロード画面を使用する方がよいでしょう。
短い答えはノーです、あなたはそれをすることはできません。
上記の両方の答えは、シーン管理の点で正しいです。シーンマネージャを使用してシーンをロードできます。非同期なので、他のコードを並行して実行できます。
詳細については、SceneManager.LoadSceneのドキュメントをご覧ください。
ゲームの開始後、できるだけ速くコードを実行できる最も近いのは、小さなフットプリントで最初のシーンからコードを実行することです。それをスプラッシュシーンと呼びましょう。含まれるのは、スプラッシュ画像とコントローラーで必要なコードを実行し、別のシーンをロードすることだけです。
フットプリントが小さいので、ロードが非常に速く、コードはほとんど瞬時に実行されます。その後、必要な操作を実行し、後でその他のシーンをロードできます。
「スプラッシュスクリーン」を削除して、そこに表示したい画像を削除することもできます。最初はロードされないため、少しだけ高速になります。
したがって、フローは次のようになります。
シーンが小さいほど、読み込みが速くなります。ロードされたスプラッシュ画面の任意のオブジェクトに接続されたスプラッシュコントローラのようなものを使用できます。
using UnityEngine;
using UnityEngine.SceneManagement;
public class SplashController: MonoBehaviour
{
void Start()
{
// RunSomeSyncMethod();
SceneManager.LoadScene("OtherSceneName", LoadSceneMode.Additive);
}
}