うにてぃブログ

主にUnityとC#に関する記事を書いていきます

【Unity】UnityEngine.Object.InstantiateAsync

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(T original, int count, ReadOnlySpan positions, ReadOnlySpan rotations)」を使用したサンプルコードです。このメソッドは、指定されたプレハブを複数の位置と回転で非同期にインスタンス化する際に使用します。

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);
}