Esempio n. 1
0
    public bool OccupyClosestAttackSlot(GameObject attacker, out int attackSlot, RAINNavigator navigator)
    {
        for (int i = 0; i < maxAttackers; i++)
        {
            if (attackers[i] == attacker)
            {
                attackSlot = i;
                return(true);
            }
        }

        List <int> openList = new List <int>();

        for (int i = 0; i < maxAttackers; i++)
        {
            if (attackers[i] == null)
            {
                openList.Add(i);
            }
        }

        float bestDistance = float.MaxValue;
        int   bestSlot     = -1;

        for (int i = 0; i < openList.Count; i++)
        {
            Vector3 attackPosition = GetAttackPosition(openList[i]);
            if ((navigator != null) && (!navigator.OnGraph(attackPosition)))
            {
                continue;
            }

            float distance = (attacker.transform.position - attackPosition).magnitude;
            if (distance < bestDistance)
            {
                bestDistance = distance;
                bestSlot     = openList[i];
            }
        }

        attackSlot = bestSlot;
        if (bestSlot < 0)
        {
            return(false);
        }

        attackers[bestSlot] = attacker;
        return(true);
    }
Esempio n. 2
0
    public bool OccupyClosestAttackSlot(GameObject attacker, out int attackSlot, RAINNavigator navigator = null)
    {
        for (int i = 0; i < maxAttackers; i++)
            if (attackers[i] == attacker)
            {
                attackSlot = i;
                return true;
            }

        List<int> openList = new List<int>();
        for (int i = 0; i < maxAttackers; i++)
            if (attackers[i] == null)
                openList.Add(i);

        float bestDistance = float.MaxValue;
        int bestSlot = -1;
        for (int i = 0; i < openList.Count; i++)
        {
            Vector3 attackPosition = GetAttackPosition(openList[i]);
            if ((navigator != null) && (!navigator.OnGraph(attackPosition)))
                continue;

            float distance = (attacker.transform.position - attackPosition).magnitude;
            if (distance < bestDistance)
            {
                bestDistance = distance;
                bestSlot = openList[i];
            }
        }

        attackSlot = bestSlot;
        if (bestSlot < 0)
            return false;

        attackers[bestSlot] = attacker;
        return true;
    }
Esempio n. 3
0
    public bool OccupyClosestAttackSlot(GameObject attacker, out int attackSlot, RAINNavigator navigator = null)
    {
        for (int i = 0; i < maxAttackers; i++)
        {
            if (attackers[i] == attacker)
            {
                attackSlot = i;
                return(true);
            }
        }

        List <int> openList = new List <int>();

        for (int i = 0; i < maxAttackers; i++)
        {
            if (attackers[i] == null)
            {
                openList.Add(i);
            }
        }

        float bestDistance = float.MaxValue;
        int   bestSlot     = -1;

        for (int i = 0; i < openList.Count; i++)
        {
            Vector3 attackPosition = GetAttackPosition(openList[i]);

            if (navigator != null)
            {
                if (navigator is BasicNavigator)
                {
                    if (NavigationManager.instance.GraphsForPoints(navigator.AI.Kinematic.Position, attackPosition, navigator.AI.Motor.StepUpHeight, NavigationManager.GraphType.Navmesh, ((BasicNavigator)navigator).GraphTags).Count == 0)
                    {
                        continue;
                    }
                }
                else
                {
                    if (!navigator.OnGraph(attackPosition, 0.5f))
                    {
                        continue;
                    }
                }
            }

            float distance = (attacker.transform.position - attackPosition).magnitude;
            if (distance < bestDistance)
            {
                bestDistance = distance;
                bestSlot     = openList[i];
            }
        }

        attackSlot = bestSlot;
        if (bestSlot < 0)
        {
            return(false);
        }

        attackers[bestSlot] = attacker;
        return(true);
    }