/// <summary> /// Funzione chiamata allo spawn in Pool dell'oggetto /// </summary> public void PoolInit() { movementCtrl = GetComponent <AgentMovementController>(); agentGravityCtrl = GetComponent <AgentGravityController>(); agentDistanceCtrl = GetComponent <AgentDistanceController>(); agentGroupCtrl = GetComponent <AgentGroupController>(); graphicCtrl = GetComponentInChildren <AgentGraphicController>(); graphicCtrl.Init(); agentGravityCtrl.Init(); agentGroupCtrl.Init(this); }
/// <summary> /// Coroutine che raggruppa il gruppo /// </summary> /// <returns></returns> private IEnumerator GroupCoroutine() { while (grouping && groupCtrl.IsSetuppedAndEnabled()) { //Prendo il riferimento agli agent List <AgentController> agents = groupCtrl.GetAgents(); if (agents == null || agents.Count == 0 || agents.Count == 1) { grouping = false; } int agentsAtWrongDistance = agents.Count; Vector3 groupCenter; Vector3 regroup; //Faccio calcolare ad ogni agent la distanza for (int i = 0; i < agents.Count; i++) { agents[i].GetAgentDistanceController().CalculateDistances(); } //Finchè tutti gli agent non sono all distanza corretta li sposto while (agentsAtWrongDistance > 0 && groupCtrl.IsSetuppedAndEnabled()) { groupCenter = groupCtrl.GetGroupCenterPoint(); agentsAtWrongDistance = 0; for (int i = 0; i < agents.Count; i++) { //L'agent controlla se ci sono ostacoli nel tragitto AgentDistanceController distanceCtrl = agents[i].GetAgentDistanceController(); if (distanceCtrl.CheckGroupDistance(groupCenter)) { //Calcolo la distanza float distance = Vector3.Distance(agents[i].transform.position, groupCenter); //Controllo la distanza tra l'agent e il centro del gruppo if (distance > distanceCtrl.GetGroupDistance()) { //Se è maggiore di quella prevista per il raggruppamento lo sposto regroup = (groupCenter - agents[i].transform.position).normalized; regroup.y = 0; agents[i].GetAgentMovementController().Move(regroup, false, groupSpeed); agentsAtWrongDistance++; } } } yield return(null); } } }