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();
    }
예제 #2
0
    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();
    }