Esempio n. 1
0
        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);
            }
        }
Esempio n. 2
0
        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!");
        }
Esempio n. 3
0
 public void AddToGroup(Agent agent, GroupSequence groupSequence)
 {
     activeGroups[agent.GetAgentId()] = groupSequence;
 }
Esempio n. 4
0
 public void SetParentGroupSequence(GroupSequence groupSequence)
 {
     parentGroupSequence = groupSequence;
 }