この記事はより詳細です。転載アドレス:https://gameinstitute.qq.com/community/detail/125245
背景
通常、ゲームのメイン シーンにはより多くのリソースが含まれているため、シーンの読み込みに時間がかかります。この問題を回避するには、最初に Loading シーンをロードしてから、Loading シーンを介してメイン シーンをロードします。Loading シーンに含まれるリソースが少ないため、読み込み速度は高速です。メイン シーンをロードするとき、現在のロードの進行状況をプレーヤーに通知するために、通常、進行状況バーがロード インターフェースに表示されます。Unity では、Application.LoadLevelAsync 関数を呼び出すことでゲーム シーンを非同期に読み込むことができ、AsyncOperation.progress の値をクエリすることでシーンの読み込みの進行状況を取得できます。
試す - 問題が発生する
最初のステップでは、ロード シーンをロードした後、次の LoadGame 関数を呼び出してゲーム シーンのロードを開始し、非同期ロードを使用してシーン 1 (ロード シーンは 0、メイン シーンは 1) をロードし、Unity が提供するコルーチン メカニズムを介して、インターフェイスに表示される進行状況バーの値を更新するために、各フレームの後に SetLoadingPercentage 関数を便利に呼び出すことができます。
public void LoadGame() {
StartCoroutine(StartLoading_1(1));
}
private IEnumerator StartLoading_1(int scene) {
AsyncOperation op = Application.LoadLevelAsync(scene);
while(!op.isDone) {
SetLoadingPercentage(op.progress * 100);
yield return new WaitForEndOfFrame();
}
}
最終的なプログレス バーの効果は次のように表示されます。
Unity の読み込み シーンのプログレス バー スライダーのスムーズな問題の読み込み
プログレスバーはロードの進行状況を継続的に表示するのではなく、数値を切り替えるために一時停止し、次に数値を切り替えるために一時停止し、最後に 100% を表示せずにメイン シーンに切り替わります。その理由は、Application.LoadLevelAsync が実際のバックグラウンド ロードではないためです.フレームごとにいくつかのゲーム リソースをロードし、進行状況の値を提供するため、ゲームはロード中にフリーズし、AsyncOperation.progress の値は十分ではありません.正確. メインのシーンが読み込まれると、Unity が自動的にシーンを切り替えるため、上記のコードの while ループ内のコードが呼び出されず、プログレス バーが 100% 表示されません。
修理 - 100% 完了
プログレス バーに 100% を表示させるには、AsyncOperation.progress の値を 2 倍にするというトリッキーな方法があります。これにより、読み込みが 50% に達したときにインターフェイスに 100% が表示されるようになります。欠点は、インターフェイスに 100% が表示されると、ユーザーがゲームに入る前にしばらく待たなければならないことです。実際、Unity にはシーンを手動で切り替える方法が用意されています. AsyncOperation.allowSceneActivation を false に設定すると、読み込み後に Unity がシーンを自動的に切り替えることを禁止できます. 変更された StartLoading_2 コードは次のとおりです:
// this function is not work
private IEnumerator StartLoading_2(int scene) {
AsyncOperation op = Application.LoadLevelAsync(scene);
op.allowSceneActivation = false;
while(!op.isDone) {
SetLoadingPercentage(op.progress * 100);
yield return new WaitForEndOfFrame();
}
op.allowSceneActivation = true;
}
最初に AsyncOperation.allowSceneActivation を false に設定し、読み込みが完了したら true に設定します。コードは正しいように見えますが、実行の結果、プログレス バーは最後に 90% のままで、シーンは切り替わりません。ログを出力すると、AsyncOperation.isDone が常に false であり、AsyncOperation.progress の値が 0.9 に増加した後も変化しないことがわかります。これは、シーンが読み込まれないことを意味します。
Unity が読み込まれる Loading Scene プログレス バー スライダーがスムーズに動作しない問題
この投稿で答えを見つけました.allowSceneActivation を false に設定した後、Unity はシーンを 90% までしかロードせず、残りの 10% は allowSceneActivation が true に設定されるまでロードされないことがわかりました.ピットになる。そのため、コードは次のように変更されます。AsyncOperation.progress が 0.9 に達したら、進行状況バーの値を直接 100% に更新し、AsyncOperation.allowSceneActivation を true に設定して、Unity が未完成のシーンをロードし続けるようにします。
private IEnumerator StartLoading_3(int scene) {
AsyncOperation op = Application.LoadLevelAsync(scene);
op.allowSceneActivation = false;
while(op.progress < 0.9f) {
SetLoadingPercentage(op.progress * 100);
yield return new WaitForEndOfFrame();
}
SetLoadingPercentage(100);
yield return new WaitForEndOfFrame();
op.allowSceneActivation = true;
}
最終的な効果は次のとおりです:
Unity が読み込みます シーンの進行状況バーのスライダーをスムーズに読み込みます 問題
グラインド - アニメーションを追加
上記のプログレスバーで100%表示の問題は解消されますが、プログレスバーの値の更新が連続的ではないため、自然で美しく見えません。継続的にロードされているように見せるために、進行状況バーが更新されるたびに遷移値を挿入できます。ここで採用した戦略は、AsyncOperation.progress の値を取得した直後にプログレス バーの値を更新するのではなく、フレームごとに元の値に 1 を追加することで、数字が連続して転がるアニメーション効果が生成されるようにすることです。 . Thunder このメソッドは、ダウンロードの進行状況を に表示するために使用されます。
private IEnumerator StartLoading_4(int scene) {
int displayProgress = 0;
int toProgress = 0;
AsyncOperation op = Application.LoadLevelAsync(scene);
op.allowSceneActivation = false;
while(op.progress < 0.9f) {
toProgress = (int)op.progress * 100;
while(displayProgress < toProgress) {
++displayProgress;
SetLoadingPercentage(displayProgress);
yield return new WaitForEndOfFrame();
}
}
toProgress = 100;
while(displayProgress < toProgress){
++displayProgress;
SetLoadingPercentage(displayProgress);
yield return new WaitForEndOfFrame();
}
op.allowSceneActivation = true;
}
displayProgress は、進行状況バーに表示される値を記録するために使用されます. 最終的な進行状況バーのアニメーションは次のとおりです:
Unity の読み込み シーンの進行状況バーのスライダーの読み込み スムーズな問題
第一種のプログレスバーと比較
Unityの読み込み シーンのプログレスバーのスライダーの読み込み スムーズな問題
要約する
ゲームのメイン シーンをロードする前に、データ テーブルを分析し、オブジェクト プールを生成し、ネットワーク接続やその他の操作を実行する必要がある場合は、これらの操作に重みを割り当て、これらの重みを使用して読み込みの進行状況を計算できます。シーンの読み込みが非常に速い場合は、偽のプログレス バーを使用して、プレイヤーがシーンを読み込む前に読み込みアニメーションを数秒間見られるようにすることができます。つまり、プログレスバーは小さいですが、うまくやるのは簡単ではありません。
元のリンク
著作権は著者に帰属します.商用転載の場合は著者に連絡して許可を得てください.非商用転載の場合は出典を明記してください.