Пример #1
0
    /// <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);
    }
Пример #2
0
    /// <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);
            }
        }
    }