如何检查我的NPC是否看到了目标的背面?

时间:2018-04-21 16:36:34

标签: c# unity3d

我认为标题说明了一切。可以仅使用矢量数学来完成吗?

var toTarget = (enemy.transform.position - npc.transform.position).normalized;
var seesBack = Vector3.Dot(toTarget, npc.transform.forward) < 0;

似乎我应该以某种方式将目标的前向矢量混合到等式中,但是当涉及到矢量数学时(好吧,数学一般来说),我真的很蹩脚)。任何人吗?

编辑:

我也试过这样做,但角度太低了。例如,如果NPC位于其目标的右侧,则计算出的角度为~60度:

var angle = Mathf.Abs(Vector3.Angle(enemy.transform.forward * -1, npc.transform.forward));
var seesBack = angle <= 70;

3 个答案:

答案 0 :(得分:3)

关闭!考虑到为了让npc看到敌人的背影,敌人必须大致朝向与从npc到敌人的向量相同的方向,即toTarget

var toTarget = (enemy.transform.position - npc.transform.position).normalized;
var seesBack = Vector3.Dot(toTarget, enemy.transform.forward) > 0;

请注意,Dot是针对敌人的变换,并且大于0。

答案 1 :(得分:0)

这两个都告诉你同样的事情:

这两个是否面向同一方向?

没有人告诉你关于哪一个在前面。

点积产品会更好,但您还需要检查谁是谁。

我能想到的一个非常头脑的方式是比较两个实体之间的距离,沿着NPC的前向矢量添加一小部分(比如,0.5个单位,一半是它的碰撞体积的大小)并获得从该点到另一个实体中心的距离。

如果偏移距离较小,则NPC落后(因为向前移动,它会更接近)。你可能也想在某个地方进行距离检查,所以“后面”不包括“三个房间”。但我认为你已经这样做了。

答案 2 :(得分:0)

  

可以仅使用矢量数学吗?

这将检查敌人是否正面向位于NPC前面。

sex