ACBのロード完了までまたずに、 処理ができます。
ゲームではとてもメリットがあって
通常のLoad関数の場合、Unityのすべての処理をブロックしてしまうため、ゲームの更新処理や入力処理などが止まってしまって、 ユーザー体験としてマイナスになりがちです。 (ロードを起動時のみや、シーン切り替えの瞬間などまとめて行うなどである程度回避はできますが)
LoadAcbFileAsync 関数を使うと回避できます。
また、ローダー数が許す限り、複数のキューシートを並列で読み込みも可能なので、ロード時間が大幅に短縮できる可能性があります。 (キューシートが細かく分割されている場合に限ります)
こんな感じの処理になるかと思います
MdsCueSheetDataにはハンドル保持とロード成功したかどうかなどフラグを持たせています。 (実際には、非同期ロードは失敗する可能性も含めて、ロード失敗時の情報なども保持させたり、リトライ実装なども必要ですが、ここでは省略)
async UniTask LoadAcbOne (string acbFilePath, string awbFilePath, MdsCueSheetData mdsCueSheetData)
{
mdsCueSheetData.LoadRequested = true;
// CRIのACBロード
// 同期ロードの場合
if (UseAsyncLoad == false)
{
if (acb != null)
{
// ACBハンドルを保持
mdsCueSheetData.acb = acb;
mdsCueSheetData.LoadRequested = true;
return mdsCueSheetData.LoadRequested;
}
// ロード失敗
mdsCueSheetData.LoadRequested = false;
return mdsCueSheetData.LoadRequested;
}
CriAtomExAcbLoader loader = CriAtomExAcbLoader.LoadAcbFileAsync (null, acbFilePath, awbFilePath);
await UniTask.WaitUntil (() =>
{
if (loader == null)
{
return true;
}
var status = loader.GetStatus ();
return status == CriAtomExAcbLoader.Status.Complete
|| status == CriAtomExAcbLoader.Status.Error;
});
if (loader == null)
{
mdsCueSheetData.LoadRequested = false;
}
if (loader != null && loader.GetStatus () == CriAtomExAcbLoader.Status.Complete)
{
CriAtomExAcb acb = loader.MoveAcb ();
// ACBハンドルを保持
mdsCueSheetData.acb = acb;
}
else
{
mdsCueSheetData.LoadRequested = false;
}
if (loader != null)
{
loader.Dispose ();
}
return mdsCueSheetData.LoadRequested;
}