我已经为玩家检测系统编写了代码。 我有一个老板,将继续寻找玩家的位置,一旦玩家在某个球体碰撞器的触发半径内,就会检测到该玩家。 使用raycast以及OnTriggerStay和OnTriggerExit完成。
问题在于播放器检测系统不是很准确,因此有时它可以工作,而有些时候则不能。我似乎找不到或理解原因。
这是我编写的(感兴趣的)代码的一部分:
void OnTriggerStay(Collider other)
{
if (other.gameObject.tag == "player")
{
playerDetected = false;
Vector3 direction = other.transform.position - transform.position;
float angle = Vector3.Angle(direction, transform.forward);
Debug.DrawRay(transform.position + transform.up / 2, direction, Color.green);
if (angle < fieldOfView)
{
RaycastHit hit;
//if (Physics.Raycast(transform.position + transform.up / 2, direction, out hit, col.radius, ignoreRaycast))
if (Physics.Raycast(transform.position + transform.up / 2, direction,out hit, col.radius))
{
if (hit.collider.gameObject.tag == "player")
{
playerDetected = true;
}
}
}
}
}
void OnTriggerExit(Collider other)
{
if (other.gameObject.tag == "player")
{
playerDetected = false;
}
}
,这是完整的代码: https://pastebin.com/YZH9Fc99
这将向您显示行为(查看PlayerDetected的不断变化) https://gyazo.com/74961847eca520a335d18c194201d0c2
答案 0 :(得分:0)
所以我发现玩家拿着一把带盒撞机触发器的剑。 当她移动剑时,它在对撞机上方,无法检测到。 通过在播放器上添加一层并忽略播放器层以外的所有内容来解决该问题。
添加
public LayerMask ignoreRaycast;
替换
if (Physics.Raycast(transform.position + transform.up / 2, direction,out hit, col.radius))
作者
if (Physics.Raycast(transform.position + transform.up / 2, direction,out hit, col.radius,ignoreRaycast))
对于ignoreRaycast,仅选择播放器层