void Initialize(int capacity) { var world = NavMeshWorld.GetDefaultWorld(); var queryCount = world.IsValid() ? k_QueryCount : 0; var agentCount = world.IsValid() ? capacity : 0; m_PlanPathForAgent = new NativeList <bool1>(agentCount, Allocator.Persistent); m_EmptyPlanPathForAgent = new NativeList <bool1>(0, Allocator.Persistent); m_PathRequestIdForAgent = new NativeList <uint>(agentCount, Allocator.Persistent); m_PathRequests = new NativeList <PathQueryQueueEcs.RequestEcs>(k_PathRequestsPerTick, Allocator.Persistent); m_PathRequests.ResizeUninitialized(k_PathRequestsPerTick); for (var i = 0; i < m_PathRequests.Length; i++) { m_PathRequests[i] = new PathQueryQueueEcs.RequestEcs { uid = PathQueryQueueEcs.RequestEcs.invalidId }; } m_PathRequestsRange = new NativeArray <int>(k_DataSize, Allocator.Persistent); m_PathRequestsRange[k_Start] = 0; m_PathRequestsRange[k_Count] = 0; m_UniqueIdStore = new NativeArray <uint>(1, Allocator.Persistent); m_CurrentAgentIndex = new NativeArray <int>(1, Allocator.Persistent); m_CurrentAgentIndex[0] = 0; m_NavMeshQuery = new NavMeshQuery(world, Allocator.Persistent); m_QueryQueues = new PathQueryQueueEcs[queryCount]; m_QueryJobs = new UpdateQueriesJob[queryCount]; m_AfterQueriesProcessed = new NativeArray <JobHandle>(queryCount, Allocator.Persistent); m_AfterQueriesCleanup = new JobHandle(); m_AfterMovedRequestsForgotten = new JobHandle(); m_IsEmptyQueryQueue = new bool[queryCount]; for (var i = 0; i < m_QueryQueues.Length; i++) { m_QueryQueues[i] = new PathQueryQueueEcs(k_MaxQueryNodes, k_MaxRequestsPerQuery); m_QueryJobs[i] = new UpdateQueriesJob() { maxIterations = k_MaxQueryIterationsPerTick, queryQueue = m_QueryQueues[i] }; m_AfterQueriesProcessed[i] = new JobHandle(); m_IsEmptyQueryQueue[i] = true; } }
public void OnRemoveSwapBack(int index) { var replacementAgent = m_PlanPathForAgent.Length - 1; m_PlanPathForAgent.RemoveAtSwapBack(index); m_PathRequestIdForAgent.RemoveAtSwapBack(index); m_AfterQueriesCleanup.Complete(); for (var i = 0; i < m_QueryQueues.Length; i++) { m_QueryQueues[i].RemoveAgentRecords(index, replacementAgent); } m_AfterMovedRequestsForgotten.Complete(); var rangeEnd = m_PathRequestsRange[k_Start] + m_PathRequestsRange[k_Count]; for (var i = m_PathRequestsRange[k_Start]; i < rangeEnd; i++) { if (m_PathRequests[i].agentIndex == index) { if (i < rangeEnd - 1) { m_PathRequests[i] = m_PathRequests[rangeEnd - 1]; m_PathRequests[rangeEnd - 1] = new PathQueryQueueEcs.RequestEcs { uid = PathQueryQueueEcs.RequestEcs.invalidId }; } rangeEnd--; i--; } else if (m_PathRequests[i].agentIndex == replacementAgent) { var req = m_PathRequests[i]; req.agentIndex = index; m_PathRequests[i] = req; } } m_PathRequestsRange[k_Count] = rangeEnd - m_PathRequestsRange[k_Start]; #if DEBUG_CROWDSYSTEM_ASSERTS Debug.Assert(m_PathRequestsRange[k_Count] >= 0); #endif }
public void Execute() { if (agents.Length == 0) { return; } // add new requests to the end of the range var reqEnd = pathRequestsRange[k_Start] + pathRequestsRange[k_Count]; var reqMax = pathRequests.Length - 1; var firstAgent = currentAgentIndex[0]; for (var i = 0; i < agents.Length; ++i) { if (reqEnd > reqMax) { break; } var index = (i + firstAgent) % agents.Length; var agentNavigator = agentNavigators[index]; if (planPathForAgent.Length > 0 && planPathForAgent[index] || agentNavigator.newDestinationRequested && pathRequestIdForAgent[index] == PathQueryQueueEcs.RequestEcs.invalidId) { if (!agentNavigator.active) { if (planPathForAgent.Length > 0) { planPathForAgent[index] = false; } agentNavigator.newDestinationRequested = false; agentNavigators[index] = agentNavigator; continue; } var agent = agents[index]; if (!query.IsValid(agent.location)) { continue; } if (uniqueIdStore[0] == PathQueryQueueEcs.RequestEcs.invalidId) { uniqueIdStore[0] = 1 + PathQueryQueueEcs.RequestEcs.invalidId; } pathRequests[reqEnd++] = new PathQueryQueueEcs.RequestEcs() { agentIndex = index, agentType = agent.type, mask = NavMesh.AllAreas, uid = uniqueIdStore[0], start = agent.location.position, end = agentNavigator.requestedDestination }; pathRequestIdForAgent[index] = uniqueIdStore[0]; uniqueIdStore[0]++; if (planPathForAgent.Length > 0) { planPathForAgent[index] = false; } agentNavigator.newDestinationRequested = false; agentNavigators[index] = agentNavigator; } currentAgentIndex[0] = index; } pathRequestsRange[k_Count] = reqEnd - pathRequestsRange[k_Start]; }