Unity3d OnTriggerEnter碰撞方向检测



好的,所以我认为这个概念应该很简单。然而,答案让我难以捉摸。编辑背景。"其他"对象和带有此代码的gameObject都有作为触发器的球体碰撞器,此gameObject有一个用于移动的CharacterController,但都没有刚体。我的目标是(玩家对象,自动移动吃豆人风格)杀死它遇到的东西,但只有当它面对它们时,否则,它应该会受到伤害。我的问题是弄清楚如何判断它是否正对着物体。要完成图片,当玩家和NPC仅沿X轴和Y轴移动时,moveDirection可以是以下其中之一(Vector3.Up、.Down、.Left或.Right)(带有3D游戏对象的正交相机)

~旧方法

void OnTriggerEnter (Collider other)
{
if (other.gameObject.tag == "Human") {
RaycastHit hit;
if (Physics.Raycast (transform.position, moveDirection, out hit)) {
StartCoroutine (eatWithBlood (1, other.gameObject.GetComponent<NPCController> ()));
} else {
TakeDamage (other.gameObject.GetComponent<NPCController> ().attack);
}
} 
}

我还尝试了以下代码,它的工作效果要好一点。数学运算不太正确,所以即使角度在45到-45之间,玩家仍然会感到"震惊"并受到伤害。如果我需要其他变量进行更准确的计算,新方法被预先配置为扩展。faceDirection变量为up=0,right=1,down=2,left=3,它们也对应于它们的Vector3.up、left、down和right队列。

~新方法

void OnTriggerEnter (Collider other)
{
if (other.gameObject.tag == "Human") {
float angle = Vector3.Angle (transform.forward, other.gameObject.transform.position);
Debug.Log ("Angle: " + angle + "; my forward: " + faceDirection + "; other forward: " + other.gameObject.GetComponent<NPCController> ().faceDirection + " ... " + Time.time);
if (IAteHim (faceDirection, other.gameObject.GetComponent<NPCController> ().faceDirection, angle)) {
other.gameObject.GetComponent<NPCController> ().EatMe ();
StartCoroutine (eatWithBlood (1, other.gameObject.GetComponent<NPCController> ()));
} else {
GameObject poof = PoofPooler.poof.GetPooledObject ();
if (poof != null) {
poof.transform.position = Vector3.Lerp (transform.position, other.gameObject.transform.position, 0.5f);
poof.GetComponent<PoofControl> ().reactivated = true;
poof.SetActive (true);
}
other.gameObject.GetComponent<NPCController> ().MakeInvincible ();
TakeDamage (other.gameObject.GetComponent<NPCController> ().attack, 2.0f);
}

}
}
bool IAteHim (int myDirection, int otherDirection, float angle)
{
if (angle > -45 && angle < 45) { // I'm facing toward yummies
return true;
} else {
return false;
}
}

更改

float angle = Vector3.Angle (transform.forward, other.gameObject.transform.position);

Vector3 direction = other.gameObject.transform.position - transform.position;
float angle = Vector3.Angle (transform.forward, direction);