Получить положение мыши в мировом пространстве

Я делаю игру с использованием Unity, и у меня есть небольшая проблема: мне нужно знать положение мыши в мировом пространстве, для этого я пытаюсь установить GameObject в положение мыши, используя этот код:

    Vector3 p = Input.mousePosition;
    Vector3 pos = Camera.main.ScreenToWorldPoint( p);
    testGameObject.transform.position = pos;

В редакторе это прекрасно работает, но в exe/apk GameObject не следует за мышью:

Пример 1

Пример 2

GameObject, который должен следовать за мышью, — это «1» внутри круга.


person Julien Renaud Le Coq    schedule 12.11.2017    source источник
comment
Ваша основная проблема заключается в понимании разницы между 2D и 3D. Курсор мыши перемещается в 2D-плоскости (плоскость экрана) и поэтому не имеет фактического положения в сцене (на самом деле он имеет третью координату, ограничивающую его плоскостью экрана). Если теперь вы пропустите луч из (воображаемой) точки глаза зрителя через положение курсора мыши на плоскости экрана, вы получите луч, а не одну точку. Теперь вам нужно вычислить пересечения этого луча с каждым объектом в вашей сцене и взять тот объект, который находится ближе всего к экрану. Это связано с аналитической геометрией.   -  person Psi    schedule 12.11.2017
comment
@Psi Честно говоря, я на самом деле не знаю, но я был бы удивлен, если бы Camera.main.ScreenToWorldPoint( p); не выстрелил лучом и не вернул свое первое очко здоровья.   -  person George    schedule 12.11.2017
comment
@George AFAIK, он возвращает 3D-позицию курсора мыши, где бы он находился на сцене, если бы это был реальный объект. Однако это 3d-позиция на плоскости экрана. Когда вы хотите знать, куда указывает курсор мыши, вы должны правильно сказать, что курсор указывает на все точки на определенной линии (луч между глазом и курсором, уходящий в бесконечность).   -  person Psi    schedule 12.11.2017
comment
Спасибо за ответы, но я все еще не понимаю. Моя камера находится в орфографическом режиме, а не в перспективе, поэтому я не понимаю, почему это не просто точка с моей точки зрения. Во всяком случае, я пробовал с raycasthit2D: `RaycastHit2D hit = Physics2D.Raycast(Camera.main.ScreenToWorldPoint(Input.mousePosition), Vector2.zero); if(hit.collider != null && hit.collider.gameObject.tag == touchZone) { testGameObject.transform.position = new Vector3(hit.point.x,hit.point.y, testGameObject.transform.position.z) ; }` Но я все еще получаю точно такую ​​же проблему..   -  person Julien Renaud Le Coq    schedule 13.11.2017
comment
Ну, я новичок в Stackoverflow, и я действительно не понимаю, как поместить код в комментарий, он говорит code, но когда я добавляю в него код, это ничего не меняет.   -  person Julien Renaud Le Coq    schedule 13.11.2017


Ответы (1)


Если он работает в редакторе как шарм, то он должен быть в сборке.

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

возможно проблема с глубиной положения с камеры. попробуйте добавить что-то вроде

Vector3 p = Input.mousePosition;
p.z = 20;
Vector3 pos = Camera.main.ScreenToWorldPoint(p);
testGameObject.transform.position = pos;

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

person endrik exe    schedule 13.11.2017
comment
Я уже пытался изменить глубину от -100 до 100, это ничего не меняет, кроме видимости объекта. Позиции X и Y всегда одинаковы... - person Julien Renaud Le Coq; 13.11.2017
comment
У вас есть несколько камер в вашей сцене? и где вы размещаете свой объект круга - person endrik exe; 13.11.2017
comment
У меня есть только 1 камера в моей сцене, объект круга является дочерним элементом другого игрового объекта, который не является дочерним элементом любого другого игрового объекта. - person Julien Renaud Le Coq; 13.11.2017
comment
Что ж, благодаря вам, я искал любую другую камеру, и нашел одну, у камеры из сцены ниже было свойство «не уничтожать при загрузке», я это исправил, вы очень помогли своим комментарием о камере, спасибо вам! - person Julien Renaud Le Coq; 14.11.2017