はなちるのマイノート

Unityをメインとした技術ブログ。自分らしくまったりやっていきたいと思いますー!

【Unity】NativeArray<T>からSpan<T>へ変換する方法(2022.2以前はunsafe, 2022.2以降はAsSpan)

はじめに

今回はNativeArray<T>からSpan<T>への変換方法を紹介したいと思います。

docs.unity3d.com

環境

Unity2022.2.0b16

2022.2以前

unsafeを利用する必要があります。

private unsafe void Start()
{
    // NativeArrayの生成
    NativeArray<byte> nativeArray = new NativeArray<byte>(100, Allocator.Temp);

    Span<byte> span = new Span<byte>(nativeArray.GetUnsafePtr(), nativeArray.Length);

    nativeArray.Dispose();
}


適当に大量に上記のコードをUpdateで呼び出しても、GC.Allocがゼロにできていることが確認できます。

ゼロアロケーション

2022.2以降

private void Start()
{
    // NativeArrayの生成
    NativeArray<byte> nativeArray = new NativeArray<byte>(100, Allocator.Temp);
        
    nativeArray[0] = 100;
    Debug.Log(nativeArray[0]);      // 100

    // NativeArrayをRead-write Spanとして受け取る
    Span<byte> span = nativeArray.AsSpan();

    Debug.Log(span[0]);             // 100
    span[0] = 200;
    Debug.Log(nativeArray[0]);      // 200
        
    // NativeArrayをReadOnly Spanとして受け取る
    ReadOnlySpan<byte> readonlySpan = nativeArray.AsReadOnlySpan();

    Debug.Log(readonlySpan[0]);     // 200
        
    nativeArray.Dispose();
}

Unity - Scripting API: Unity.Collections.NativeArray_1.AsSpan
Unity - Scripting API: Unity.Collections.NativeArray_1.AsReadOnlySpan