如何从玩家那里检测游戏对象是左侧还是右侧

时间:2019-05-24 00:46:34

标签: c# unity3d rotation position

Debug.Log总是返回LEFT,而只有在播放器右侧时才需要正确。 现在,它同时显示左右(当位于游戏对象的右侧时)。

if (distance <= 249)
        {
            if (enemy.transform.position.x > player.transform.position.x)
            {
                if (waitTime == 0)
                {
                    Debug.Log("LEFT");
                    FireGunsLeft();
                }
            }
            else 
            {
                if (waitTime == 0)
                {
                    Debug.Log("RIGHT");
                    FireGunsRight();
                }
            }

        }

2 个答案:

答案 0 :(得分:1)

使用player.transform.InverseTransformPoint(enemy.transform.position)

您可以使用Transform.InverseTransformPoint从玩家的角度查找敌人的相对位置。

Vector3 enemyDirectionLocal = player.transform.InverseTransformPoint(enemy.transform.position);

Vector3 enemyDirectionLocal是一个向量,描述了敌人的位置偏移  从播放器的位置沿播放器的左/右,上/下和前进/后退轴。

这意味着,如果enemyDirectionLocal.x小于零,则它位于播放器的左侧(尽管也可能位于播放器的前面或后面),如果大于零,则它位于播放器的右侧。如果为零,则直接位于播放器的后面或前面。

Vector3 enemyDirectionLocal = player.transform.InverseTransformPoint(enemy.transform.position);

if (enemyDirectionLocal.x < 0)
{
    if (waitTime == 0)
    {
        Debug.Log("LEFT");
        FireGunsLeft();
    }
}
else if (enemyDirectionLocal.x > 0)
{
    if (waitTime == 0)
    {
        Debug.Log("RIGHT");
        FireGunsRight();
    }
}

答案 1 :(得分:0)

另一种方法是找到玩家位置和敌人位置var directionToEnemy = enemy.transform.position - player.transform.position之间的向量,然后找到它在玩家变换的right向量上的投影,当敌人是在播放器右侧:

var directionToEnemy = enemy.transform.position - player.transform.position;
var projectionOnRight = Vector3.Dot(directionToEnemy, player.transform.right);

if (projectionOnRight < 0)
{
    if (waitTime == 0)
    {
        Debug.Log("LEFT");
        FireGunsLeft();
    }
}
else if (projectionOnRight > 0)
{
    if (waitTime == 0)
    {
        Debug.Log("RIGHT");
        FireGunsRight();
    }
}

您还可以考虑在进行相对位置的计算之前先进行waitTime == 0检查。

如果Mathf.Approximately(projectionOnRight, 0f)返回true,那么敌人就在玩家的面前,您可能想要执行FireGunsStraight()或在这种情况下执行的所有操作。