Unity 2022.3.20f1から、「Object.InstantiateAsync」が新たに導入されました。これにより、プレハブの非同期インスタンス化が可能になりました。
従来のUnityでは、プレハブのインスタンス化は同期的に行われていました。これにより、複数のプレハブを同時に生成しようとすると、ゲームの進行が一時停止したり、フレームレートが低下したりする問題がありました。
しかし、「Object.InstantiateAsync」を使用すると、プレハブのインスタンス化をゲームの他のプロセスと並行して行うことができ、ゲームの流れを中断せずにフレームレートを安定させながらプレハブを生成できます。この機能は、特に大量のプレハブが必要なシーンや、重いコンテンツのロードが必要な場面で、ゲームパフォーマンスの最適化とプレイの滑らかさを向上させます。
Unity 2022.3.20f1では、以下の「InstantiateAsync」メソッドが追加されました。
InstantiateAsync<T>(T original) InstantiateAsync<T>(T original, Transform parent) InstantiateAsync<T>(T original, Vector3 position, Quaternion rotation) InstantiateAsync<T>(T original, Transform parent, Vector3 position, Quaternion rotation) InstantiateAsync<T>(T original, int count) InstantiateAsync<T>(T original, int count, Transform parent) InstantiateAsync<T>(T original, int count, Vector3 position, Quaternion rotation) InstantiateAsync<T>(T original, int count, ReadOnlySpan<Vector3> positions, ReadOnlySpan<Quaternion> rotations) InstantiateAsync<T>(T original, int count, Transform parent, Vector3 position, Quaternion rotation) InstantiateAsync<T>(T original, int count, Transform parent, ReadOnlySpan<Vector3> positions, ReadOnlySpan<Quaternion> rotations)
サンプル
以下は、Unity 2022.3.20f1における「InstantiateAsync」メソッドの一つである「InstantiateAsync
private IEnumerator Start() { int count = 5; // インスタンス化する数 // 位置と回転を設定 Vector3[] positions = new Vector3[count]; Quaternion[] rotations = new Quaternion[count]; for (int i = 0; i < count; i++) { positions[i] = new Vector3(i * 2.0f, 0, 0); // 位置をずらして設定 var rotation = Quaternion.Euler(Random.Range(0, 180f), Random.Range(0, 180f), Random.Range(0, 180f)); // 回転を設定 rotations[i] = rotation; } // 位置と回転データをReadOnlySpanに変換 ReadOnlySpan<Vector3> positionSpan = new ReadOnlySpan<Vector3>(positions.ToArray()); ReadOnlySpan<Quaternion> rotationSpan = new ReadOnlySpan<Quaternion>(rotations.ToArray()); // 非同期インスタンス化 yield return InstantiateAsync(prefab, count, positionSpan, rotationSpan); }