Unity 查找两个角度范围内且具有最大长度(饼图切片)的对象

Unity find objects within range of two angles and with a max length (pie slice)

我一直在为 Hack n Slash 编写一项功能,它需要检查饼图切片内的单位(或两个最大长度的角度之间)。但是我卡在了如何检查一个单位是否在弧内。

Scenario(不够,图片代表对不起我是新人)

我目前使用Physics2D.OverlapSphere()来获取最大范围内的所有对象。然后我遍历所有找到的对象,看看它们是否在我指定的两个角度内。然而,这有 janky 结果,可能是因为角度不喜欢负值和 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;
}

Vector2.Angle(startPosition, possibleTarget.transform.position);

这是错误的。想象一条从场景原点 (0,0) 到 startPosition 的直线和一条到 transform.position 的直线。 Vector2.Angle 给出了这两条线之间的角度,这不是您想要测量的。

你真正想要的是给GetEntitiesInArc一个正向向量然后得到从原点到目标位置(var directionToTarget = startPosition - possibleTarget.transform.position)的向量并测量Vector2.Angle(forward, directionToTarget).