Единство: игрок должен смотреть в направлении мыши. Почему этот код работает? - PullRequest
4 голосов
/ 18 марта 2019

Я работаю над простым проектом, следуя этому уроку , и одна из первых вещей, которые мне нужны, это заставить игрока указывать на положение мыши.

Для этого я написал этот код, следуя инструкции:

private void Update()
{
     Vector3 input = Input.mousePosition;
     Vector3 mousePosition = camera.ScreenToWorldPoint(new Vector3(input.x, input.y, camera.transform.position.y));
     transform.LookAt(mousePosition + Vector3.up * transform.position.y);
}

Вот проблема: это работает, но я не совсем понимаю , почему это работает. Я прочитал документацию по ScreenToWorldPoint и все еще немного не уверен.

У меня двоякий вопрос:

  1. Почему я использую camera.transform.position.y для z компонента вектора, который я передаю ScreenToWorldPoint?

  2. Почему добавление Vector3.up * transform.position.y работает? Без этого, если мышь находится слишком близко к игроку, она будет вращать тело и заставлять его двигаться. При этом игрок строго вращается только в плоскости xz.

Редактировать: Вот демонстрация вращения, чтобы показать, что он работает.

Ответы [ 2 ]

4 голосов
/ 18 марта 2019

Почему я использую camera.transform.position.y для компонента z вектора, который я передаю в ScreenToWorldPoint?

Третьим компонентом переданного вектора является позиция z в мировых единицах измерения от камеры. Вы можете прочитать это в документации здесь: https://docs.unity3d.com/ScriptReference/Camera.ScreenToWorldPoint.html

Причина, по которой это камера y, заключается в том, что мы стремимся получить мировую точку на уровне земли, которая находится на расстоянии одной камеры от нашего положения глаз. Если камера будет в два раза выше, она все равно будет на расстоянии камеры от глаз.

Почему добавление Vector3.up * transform.position.y работает? Без этого, если мышь находится слишком близко к игроку, она будет вращать тело и заставлять его двигаться. При этом игрок строго вращается только в плоскости xz.

Я предполагаю, что объекты не на нулевой высоте y. Так что, если мировая позиция находится на нулевой высоте, она будет вращать тело. Поэтому взгляд на точку изменяется в соответствии с высотой объекта. Когда вы умножаете вектор на число с плавающей точкой, в результате получается вектор, в котором каждый элемент умножается на число с плавающей точкой.

2 голосов
/ 18 марта 2019

Примечание. Мой ответ для 1 относится только к использованию 3D-перспективной камеры, в отличие от ситуации ОП

  1. Расстояние z установлено на положение камеры z, поскольку в этом случае глубина не имеет значения. Если вы хотите установить ближнюю плоскость, то вы использовали бы это в качестве расстояния z, потому что именно так далеко вы хотите посмотреть. По сути это расстояние от камеры до точки.

  2. Vector3.up = (0, 1, 0), поэтому при добавлении преобразования вы пропускаете две другие оси. Я почти уверен, что это то же самое, что и new Vector3(0, transform.position.y, 0)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...