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)
.
我一直在为 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)
.