スムーズでスムーズな非同期読み込みコードと原則

この記事はより詳細です。転載アドレス: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の読み込み シーンのプログレスバーのスライダーの読み込み スムーズな問題

要約する

ゲームのメイン シーンをロードする前に、データ テーブルを分析し、オブジェクト プールを生成し、ネットワーク接続やその他の操作を実行する必要がある場合は、これらの操作に重みを割り当て、これらの重みを使用して読み込みの進行状況を計算できます。シーンの読み込みが非常に速い場合は、偽のプログレス バーを使用して、プレイヤーがシーンを読み込む前に読み込みアニメーションを数秒間見られるようにすることができます。つまり、プログレスバーは小さいですが、うまくやるのは簡単ではありません。
元のリンク

著作権は著者に帰属します.商用転載の場合は著者に連絡して許可を得てください.非商用転載の場合は出典を明記してください.

おすすめ

転載: blog.csdn.net/Kevin_meta/article/details/127438345