Unityスプラッシュスクリーンの間に独自のロードスクリプトを実行できますか?


10

Unityスプラッシュスクリーンが起動しているときに、データをバックグラウンドでロードできますか?もしそうなら、どうですか?

アセットをロードするだけでなく、スプラッシュスクリーン中にコードを実行しようとしています。

GoogleやUnityのドキュメントでこれに関する情報を見つけることができませんでした。


2
スプラッシュスクリーンが表示されているとき、Unityはすでにアプリケーション全体をロードしていると思います。あなたがしたいことは可能だとは思いませんが、今回は間違ってしまいたいです。
ヘリウム

2
これは少しXY問題のように感じられます。なぜその画面の間にデータをロードしたいのですか?
doppelgreener

1
ゲームの最初のシーンに配置したものは、そのスプラッシュスクリーンが開いている間に読み込まれますよね?それで、最初のシーンにロードしたいコンテンツ(カメラ外、無効、またはコンテンツをすぐに表示したくない場合は単に参照)を含めるだけでは不十分でしょうか?または、Webサーバーなどの別のソースからコンテンツをロードしようとしていますか?
DMGregory

@DMGregory素晴らしい点。質問を更新しました。コードを実行しようとしています。
Evorlor 2017年

コードを実行しようとしているとのことですが(ロードスクリプトは必ずコードです)、どのようなコードで、なぜですか?あなたは問題を抱えており、解決策はUnityスプラッシュ画面の間にそのコードを実行することであると判断しました。何故ですか?
doppelgreener

回答:


9

いくつかのテストを実行したところ、スプラッシュスクリーンが表示されている間に、最初のシーンのオブジェクトのコンストラクターが実際に呼び出されることがわかりました。

静的なストップウォッチで測定したタイミングは次のとおりです。

Constructed  0     s
Awake        2.118 s
OnEnable     2.12  s
Start        2.744 s
First Update 2.919 s

したがって、スプラッシュスクリーンが終了する3秒近く前に(デフォルト設定で)スクリプトをトリガーして、コンストラクターからスクリプトを起動できるように見えます。そこから(おそらく独自のスレッドで)ロードコードをトリガーしてみることができます。

これはおそらく読み込みスレッドから呼び出されていることに注意してください。メインスレッドではないので、ここで許可されていることはもう少し制限されます。ロードスレッドでサポートされていない特定のことを実行しようとしている場合は、アプリケーションの詳細を記載した新しい質問を投稿することを検討してください。その場合の回避策を見つけることができます。


1
終了の3秒前、つまり開始の1秒前?
ジェイコブ

私の実験ではUpdate()、コンストラクターが起動してから2.9秒後にスクリプトが最初のティックを取得します。これで、現在の装置で識別できることはほぼすべてです。
DMGregory

2

最善の策は、独自のロード画面を作成し、それを最初のシーンとして設定することです。次に、その単純なシーンから、シーンマネージャを使用して、バックグラウンドで次のシーンを非同期的にロードします

これを確認するための情報は見つかりませんが、私の観察から、スプラッシュスクリーンが表示されている間にUnityが最初のシーンをロードしているようです。

一部のプラットフォームでは、ロードが十分に速い場合、スプラッシュスクリーンが消える前にゲームが実行を開始します。

これはすべて、いつでも、どのプラットフォームでも、どのバージョンのアップデートでも変更できます。これが一貫している保証はないので、独自のロード画面を使用する方がよいでしょう。


二重ロード画面はあなたが提案しているものですか?
Evorlor 2017年

本質的にはい。Unityでそれを行う方法です。次のシーンをロードする間、ゲームまたはスタジオのロゴアニメーションのスプラッシュ/ロード画面を配置します。
ステファンホッケンハル2017年

1
@Evorlorこれは私が私のゲームでやっていることであり、完全にうまくいきます。Unityのイントロにかかる時間を利用することはできませんが、そのイントロはかなり短くなる可能性があるため、ローディング画面(汎用ではあります)を作成し、それを使用することができます。
ジョンハミルトン

-1

短い答えはノーです、あなたはそれをすることはできません。

上記の両方の答えは、シーン管理の点で正しいです。シーンマネージャを使用してシーンをロードできます。非同期なので、他のコードを並行して実行できます。

詳細については、SceneManager.LoadSceneのドキュメントをご覧ください。

ゲームの開始後、できるだけ速くコードを実行できる最も近いのは、小さなフットプリントで最初のシーンからコードを実行することです。それをスプラッシュシーンと呼びましょう。含まれるのは、スプラッシュ画像とコントローラーで必要なコードを実行し、別のシーンをロードすることだけです。

フットプリントが小さいので、ロードが非常に速く、コードはほとんど瞬時に実行されます。その後、必要な操作を実行し、後でその他のシーンをロードできます。

「スプラッシュスクリーン」を削除して、そこに表示したい画像を削除することもできます。最初はロードされないため、少しだけ高速になります。

したがって、フローは次のようになります。

  1. スプラッシュスクリーン(ここに画像はありません。黒にしてください)
  2. スプラッシュシーン(最初のコードと次のシーンローダーを含む小さなフットプリント)
  3. イントロシーン(通常のイントロシーン)
  4. ....(他の通常のシーン)

シーンが小さいほど、読み込みが速くなります。ロードされたスプラッシュ画面の任意のオブジェクトに接続されたスプラッシュコントローラのようなものを使用できます

using UnityEngine;
using UnityEngine.SceneManagement;

public class SplashController: MonoBehaviour
{
    void Start()
    {

        // RunSomeSyncMethod();

        SceneManager.LoadScene("OtherSceneName", LoadSceneMode.Additive);
    }
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.