Unity находит объекты в диапазоне двух углов и с максимальной длиной (круговой срез) - PullRequest
0 голосов
/ 21 мая 2018

Я программировал способность для Hack n Slash, которая должна проверять Единицы внутри кругового среза (или между двумя углами с максимальной длиной).Но я застрял на том, как проверить, находится ли юнит внутри дуги.

Сценарий (недостаточно, репутация для изображения, извините, я новичок)

Я в настоящее времяиспользуйте Physics2D.OverlapSphere () , чтобы получить все объекты в максимальном диапазоне.Затем я перебираю все найденные объекты, чтобы увидеть, находятся ли они в пределах двух указанных мной углов.И все же это приводит к непредсказуемым результатам, вероятно потому, что углам не нравятся отрицательные значения и значения выше 360.

Как я могу сделать эту работу или есть лучший способ сделать это?Возможно, мне нужно изменить способ проверки того, находится ли угол в пределах.

Заранее спасибо, ребята!Я мог бы ответить с некоторой задержкой, поскольку я не буду на своем ноутбуке пару часов.

Вот фрагмент кода:

public static List<EntityBase> GetEntitiesInArc(Vector2 startPosition, float angle, float angularWidth, float radius)
{
    var colliders = Physics2D.OverlapCircleAll(startPosition, radius, 1 << LayerMask.NameToLayer("Entity"));
    var targetList = new List<EntityBase>();

    var left = angle - angularWidth / 2f;
    var right = angle + angularWidth / 2f;

    foreach (var possibleTarget in colliders)
    {
        if (possibleTarget.GetComponent<EntityBase>())
        {
            var possibleTargetAngle = Vector2.Angle(startPosition, possibleTarget.transform.position);
            if (possibleTargetAngle >= left && possibleTargetAngle <= right)
            {
                targetList.Add(possibleTarget.GetComponent<EntityBase>());
            }
        }
    }

    return targetList;
}

1 Ответ

0 голосов
/ 21 мая 2018

Vector2.Angle (startPosition, возможныхTarget.transform.position);

Это неправильно.Представьте линию от начала сцены (0,0) до startPosition и линию до transform.position.Vector2.Angle дает вам угол между этими двумя линиями, а это не то, что вы хотите измерить.

То, что вы на самом деле хотите, это дать GetEntitiesInArc прямой вектор, а затем получить вектор от начала координат доцелевая позиция (var directionToTarget = startPosition - possibleTarget.transform.position) и мера Vector2.Angle(forward, directionToTarget).

...