private void ProcessGroupMoveBeforeMeet(AgentData agentData) { var agent = agentData.Agent; GroupSequence groupSequence = null; if (SimulationController.Instance.GroupManager.IsMemberOfAGroup(agent)) { Debug.Log("Already a member of a group!"); SimulationController.Instance.GroupManager.GetActiveGroup(agent); } else if (SimulationController.Instance.GroupManager.CanCreateAGroup(agent, agent.GetNextSequence())) { Debug.Log("Creating a group!"); SimulationController.Instance.GroupManager.CreateGroup(agent, agent.GetNextSequence(), agentData.StartingDoor); } else { Debug.Log("Act as individual"); ProcessIndividualMoveAgent(agentData); return; } groupSequence = SimulationController.Instance.GroupManager.GetActiveGroup(agent); if (groupSequence.LeaveDoorTogether) { for (var index = 0; index < groupSequence.agents.Count; index++) { var groupSequenceAgent = groupSequence.agents[index]; groupSequenceAgent.gameObject.SetActive(true); groupSequenceAgent.gameObject.GetComponent <NavMeshAgent>().enabled = false; groupSequenceAgent.SetStartingPosition(agentData.StartingDoor); groupSequenceAgent.gameObject.GetComponent <MeshRenderer>() .SetPropertyBlock(agentData.MaterialPropertyBlock); groupSequenceAgent.StartSequence(AgentState.WalkingToMeetingPosition); groupSequenceAgent.GetNextSequence().disabled = true; groupSequence.MarkAgentArrived(); if (!activeAgents.Contains(groupSequenceAgent)) { activeAgents.Add(groupSequenceAgent); } } OverallData.Instance.AddAgentsLeavingBuilding(groupSequence.agents.Count); } else { agent.gameObject.SetActive(true); agent.gameObject.GetComponent <NavMeshAgent>().enabled = false; agent.SetStartingPosition(agentData.StartingDoor); agent.SetTarget(groupSequence.MeetingPoint); agent.gameObject.GetComponent <MeshRenderer>().SetPropertyBlock(agentData.MaterialPropertyBlock); agent.StartSequence(AgentState.WalkingToMeetingPosition); //Data only OverallData.Instance.AddAgentsLeavingBuilding(1); } }
public void CreateGroup(Agent agent, Sequence sequence, Door startingDoor) { Door targetDoor = SimulationController.Instance .BuildingManager.GetFinishingDoorByTargetBuilding( startingDoor, sequence.TargetBuildingId ); List <Agent> availableAgents = new List <Agent>(); foreach (var sequenceGroupingAgent in sequence.GroupingAgents) { if (IsAgentAvailableForGrouping(agent, sequence, sequenceGroupingAgent)) { availableAgents.Add(SimulationController.Instance.AgentManager.GetAgentById(sequenceGroupingAgent)); } } availableAgents.Add(agent); tempSet.Clear(); sameBuildingStarters.Clear(); var meetingPosition = CalculateMeetingPosition(startingDoor, targetDoor, availableAgents); var groupSequence = new GroupSequence(meetingPosition, targetDoor.transform.position, targetDoor); var subgroupList = new List <int>(); //Find agents that will leave the building at the same time, create a subgroup for them for (int i = 0; i < availableAgents.Count; i++) { for (int j = i + 1; j < availableAgents.Count; j++) { if (tempSet.Contains(i) || tempSet.Contains(j)) { continue; } if (availableAgents[i].GetNextSequence().StartingBuildingId == availableAgents[j].GetNextSequence().StartingBuildingId) { tempSet.Add(j); if (!sameBuildingStarters.Contains(availableAgents[i])) { sameBuildingStarters.Add(availableAgents[i]); } if (!sameBuildingStarters.Contains(availableAgents[j])) { sameBuildingStarters.Add(availableAgents[j]); } } } if (sameBuildingStarters.Count > 1) { subgroupList.Add(sameBuildingStarters.Count); Debug.Log("Same building group!"); tempSet.Add(i); var leaveTogetherGroup = new GroupSequence(); leaveTogetherGroup.agentCount = sameBuildingStarters.Count; leaveTogetherGroup.SetParentGroupSequence(groupSequence); foreach (var sameBuildingStarter in sameBuildingStarters) { Debug.Log($"Same building agent ID: {sameBuildingStarter.GetAgentId()}", sameBuildingStarter); leaveTogetherGroup.AddAgent(sameBuildingStarter); activeGroups[sameBuildingStarter.GetAgentId()] = leaveTogetherGroup; } } sameBuildingStarters.Clear(); } //Create the main group for (var index = 0; index < availableAgents.Count; index++) { var availableAgent = availableAgents[index]; if (!tempSet.Contains(index)) { activeGroups[availableAgent.GetAgentId()] = groupSequence; subgroupList.Add(1); } groupSequence.AddAgent(availableAgent); groupSequence.debugText += $" - {availableAgent.GetAgentId()} - "; } groupSequence.agentCount = availableAgents.Count; OverallData.Instance.AddParentGroup(groupSequence.agentCount); OverallData.Instance.AddSubgroupSize(groupSequence.agentCount, subgroupList); Debug.Log("A group is created!"); }
public void AddToGroup(Agent agent, GroupSequence groupSequence) { activeGroups[agent.GetAgentId()] = groupSequence; }
public void SetParentGroupSequence(GroupSequence groupSequence) { parentGroupSequence = groupSequence; }