public void NativeMultiHashMap_GetKeysAndValues() { var hashMap = new NativeMultiHashMap <int, int> (1, Allocator.Temp); for (int i = 0; i < 30; ++i) { hashMap.Add(i, 30 + i); hashMap.Add(i, 60 + i); } var keysValues = hashMap.GetKeyValueArrays(Allocator.Temp); hashMap.Dispose(); Assert.AreEqual(60, keysValues.Keys.Length); Assert.AreEqual(60, keysValues.Values.Length); // ensure keys and matching values are aligned (though unordered) for (int i = 0; i < 30; ++i) { var k0 = keysValues.Keys[i * 2 + 0]; var k1 = keysValues.Keys[i * 2 + 1]; var v0 = keysValues.Values[i * 2 + 0]; var v1 = keysValues.Values[i * 2 + 1]; if (v0 > v1) { (v0, v1) = (v1, v0); } Assert.AreEqual(k0, k1); Assert.AreEqual(30 + k0, v0); Assert.AreEqual(60 + k0, v1); } keysValues.Keys.Sort(); for (int i = 0; i < 30; ++i) { Assert.AreEqual(i, keysValues.Keys[i * 2 + 0]); Assert.AreEqual(i, keysValues.Keys[i * 2 + 1]); } keysValues.Values.Sort(); for (int i = 0; i < 60; ++i) { Assert.AreEqual(30 + i, keysValues.Values[i]); } keysValues.Dispose(); }
public void FindPath() { NativeHashMap <int2, bool> isObstacle = new NativeHashMap <int2, bool>(obstacles.Count, Allocator.TempJob); NativeArray <int2> offsets = new NativeArray <int2>(8, Allocator.TempJob); NativeArray <Node> nativeStarts = new NativeArray <Node>(starts.Count, Allocator.TempJob); NativeMultiHashMap <int2, Node> resultList = new NativeMultiHashMap <int2, Node>((starts.Count) * safeGuard, Allocator.TempJob); foreach (int2 o in obstacles.Keys) { isObstacle.Add(o, true); } int counter = 0; foreach (Node n in starts.Values) { nativeStarts[counter] = n; counter++; } offsets[0] = new int2(0, 1); offsets[1] = new int2(1, 1); offsets[2] = new int2(1, 0); offsets[3] = new int2(1, -1); offsets[4] = new int2(0, -1); offsets[5] = new int2(-1, -1); offsets[6] = new int2(-1, 0); offsets[7] = new int2(-1, 1); AStar aStar = new AStar { isObstacle = isObstacle, offsets = offsets, starts = nativeStarts, resultList = resultList, end = end, safeGuard = safeGuard, }; JobHandle handle = aStar.Schedule(starts.Count, 16); handle.Complete(); NativeKeyValueArrays <int2, Node> keyValueArray = resultList.GetKeyValueArrays(Allocator.Temp); Dictionary <int2, Queue <Node> > paths = new Dictionary <int2, Queue <Node> >(); for (int i = 0; i < keyValueArray.Keys.Length; i++) { if (!paths.ContainsKey(keyValueArray.Keys[i])) { paths.Add(keyValueArray.Keys[i], new Queue <Node>()); paths[keyValueArray.Keys[i]].Enqueue(keyValueArray.Values[i]); } else { paths[keyValueArray.Keys[i]].Enqueue(keyValueArray.Values[i]); } } foreach (int2 start in paths.Keys) { StartCoroutine(MoveUnitCoroutine(start, paths[start])); } isObstacle.Dispose(); offsets.Dispose(); nativeStarts.Dispose(); resultList.Dispose(); }