Exemplo n.º 1
0
    //Conectar goals con unidades
    void connectGoalsWithUnits()
    {
        Unit[] avaUnitsArray = new Unit[units.Count];
        units.CopyTo(avaUnitsArray);

        List <Unit> availableUnits = new List <Unit>(avaUnitsArray);

        //Recorremos la lista de celdas objetivo

        for (int i = 0; i < cellGoals.Count; i++)
        {
            if (availableUnits.Count <= 0)
            {
                break;
            }

            float proportionCurve   = (float)i / ((float)cellGoals.Count - 1f);
            int   allocatedUnitsNum = Mathf.FloorToInt(units.Count * allocationCurve.Evaluate(proportionCurve));

            if (availableUnits.Count < allocatedUnitsNum)
            {
                allocatedUnitsNum = availableUnits.Count;
            }

            Unit[] allocatedUnits = new Unit[allocatedUnitsNum];

            Heap <UnitHeapable> heapUnits = new Heap <UnitHeapable>(availableUnits.Count);

            foreach (Unit unit in availableUnits)
            {
                //pathfinder.CalculaGridParaUnidad(unit, enemyUnits)
                pathfinder.SetUnitMap(unit, cellGoals);
                //Calcular la distancia desde la unidad hasta la celda objetivo goal.cell
                unit.SetPath(pathfinder.FindPathHexagonalAI(unit.GetUnitCell(), cellGoals[i].cell));
                heapUnits.Add(new UnitHeapable(unit, unit.GetPath().Count));
            }

            //Quitamos las unidades de mayor distancia hasta tener las adecuadas para la tarea
            while (heapUnits.Count > allocatedUnitsNum)
            {
                heapUnits.RemoveFirst();
            }

            //Hacer movimiento/acción de la unidad y removerla de units para que ningún otro objetivo la tenga en cuenta.

            //Los que quedan son los seleccionados para la tarea.
            //Como ya tienen su camino asignado, no necesitan más manipulación
            while (heapUnits.Count > 0)
            {
                Unit unit = heapUnits.RemoveFirst().unit;
                availableUnits.Remove(unit);
                unit.Move();
            }
        }
    }