こんにちは!いかついプログラマです。
今回は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を二次元配列として扱うことができました!
それではまた!