Как определить, находится ли игровой объект слева или справа от игрока - PullRequest
0 голосов
/ 24 мая 2019

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 ]

1 голос
/ 24 мая 2019

Использование 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();
    }
}
0 голосов
/ 24 мая 2019

Другой подход заключается в том, чтобы найти Вектор между позицией игрока и позицией врага var directionToEnemy = enemy.transform.position - player.transform.position, а затем найти его проекцию на вектор right трансформации игрока, имея значение> 0, когда враг находится справа от игрок:

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) возвращает истину, то враг находится прямо перед игроком, и вы можете выполнить FireGunsStraight() или что-то еще, что у вас есть для этого случая.

...