アヒルのある日

株式会社AHIRUの社員ブログです。毎週更新!社員が自由に思いついたことを書きます。

【Unity】NativeArrayで二次元配列を表現する

こんにちは!いかついプログラマです。

今回はUnityのNativeArrayで二次元配列を表現する方法を紹介します。


そもそもとして、NativeArrayでは、

NativeArray<NativeArray<int>>

のような形で二次元配列として宣言することができません。
そこで、NativeArrayの先頭ポインタを格納したNativeArrayを作成することで、二次元配列として機能させます。

コード例
public class TestData
{
    public NativeArray<int> TestDataArray;

    public TestData()
    {
        // intのNativeArray
       TestDataArray = new NativeList<int>(100, Allocator.Persistent);
    }

    public void Dispose()
    {
        TestDataArray.Dispose();
    }
}

public unsafe class Test2DNativeArray : MonoBehaviour
{
    private NativeList<IntPtr> m_testDataPtrs;
    private List<TestData> m_testDatas;

    public unsafe void Start()
    {
        // ここにNativeArrayの先頭ポインタを追加していく
        m_testDataPtrs = new NativeList<IntPtr>(100, Allocator.Persistent);
        for (int i = 0; i < 100; i++)
        {
            var testData  = new TestData();
            m_tesdDataPtrs.Add((IntPtr)testData.TestDataArray.GetUnsafePtr());
        }
    }

    public unsafe int* GetPtr(int Index, int offset)
    {
        var ptr = (int*)m_testDataPtrs[index];
	return ptr + offset;
    }

    public void OnDestroy()
    {
        m_testDataPtrs.Dispose();
    }
}


例では、int型の二次元配列(100*100)を作成しています。
また、配列の値を読み書きする場合には

// m_testDataPtrs[5][10]のポインタを取得
var ptr = GetPtr(5, 10);
// m_testDataPtrs[5][10]のデータを読み取り
int x = *ptr;
// m_testDataPtrs[5][10]にデータを書き込み
*ptr = x * 5;

のように記述します。

これで、NativeArrayを二次元配列として扱うことができました!
それではまた!