Как я могу перевести положение объекта пользовательского интерфейса в трехмерное положение мира в единстве - PullRequest
0 голосов
/ 19 марта 2020

Я хочу перевести позицию элемента пользовательского интерфейса в трехмерное пространство, как я могу сделать это в единстве, и C# Я пытался сделать это, но это не работает:

Camera.main.ScreenToWorldPoint(UI.Canvas.transform.position);

Мой холст находится в режиме наложения пространства экрана.

Ответы [ 2 ]

0 голосов
/ 20 марта 2020
Camera.main.ScreenToWorldPoint(UI.Canvas.transform.position);

Это даст вам трехмерную мировую позицию UI Canvas (игровой объект). Вы были на правильном пути, этот метод преобразует точку пространства 2D-экрана в положение мирового пространства. Но вы вошли в мировую космическую позицию.

Вместо этого вам нужно указать место на экране для элемента canvas и преобразовать его в мировое пространство. Я думаю, немного взад-вперед.

Vector3 uiElementPosition = CanvasCamera.WorldToScreenPoint(CurrentUIElementWorldPosition);

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

Vector3 coolNewWorldPosition = Camera.main.ScreenToWorldPoint(uiElementPosition);
0 голосов
/ 19 марта 2020

Найдено это сообщение от karma0413 на форумах Unity:

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

Лучшим объяснением CANVAS SCALING является использование моей последней проблемы ...

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

Дни и дни исследований и попытки различных комбинаций наконец-то показали мне, что, возможно, существует проблема масштабирования, которая указала мне чтобы посмотреть Canvas / Canvas Scaler / режим масштабирования: масштаб с экраном

Первоначально это работало замечательно, когда у меня был только 1 персонаж, а его индикатор здоровья оставался прикрепленным к верхней части экрана, как старый классические игры двойного дракона. НО, когда я принял решение иметь много персонажей, и им всем нужны «плавающие панели здоровья», я не вернулся, чтобы переоценить необходимость изменения этой опции.

Установка Scaler для canvas: постоянный размер пикселя , исправляет проблему, и теперь у меня правильная точка WORLDtoSCREENpoint, которая мне нужна! И теперь панель здоровья прекрасно парит над персонажами ...

НО ЖДУ, ДРУГАЯ ПРОБЛЕМА! Теперь, если разрешение экрана небольшое ... Ui-спрайт слишком большой ..... и если разрешение экрана высокой четкости, то Ui-спрайт слишком мал!

ВОПРОС: Так как мне использовать режим «масштабировать с размером экрана», но при этом получить корректный WorldToScreenPoint?

ОТВЕТ: вы должны учитывать общее масштабирование холста, когда он растягивается, чтобы соответствовать (независимо от текущего разрешения, которое вы используете)

ВМЕСТО:

myPositionOnScreen = Camera.main.WorldToScreenPoint (myOwner);
myRect.anchoredPosition = myPositionOnScreen

ВЫ РАССЧИТАЕТЕ ОБЩИЙ МАСШТАБНЫЙ ФАКТОР, КАК ЭТО:

RectTransform myRect = GetComponent<RectTransform>(); Vector2
myPositionOnScreen = Camera.main.WorldToScreenPoint (myOwner);
      Canvas copyOfMainCanvas = GameObject.Find ("Canvas").GetComponent <Canvas>(); float scaleFactor =
copyOfMainCanvas.scaleFactor
      Vector2 finalPosition = new Vector2 (myPositionOnScreen.x / scaleFactor , myPositionOnScreen.y / scaleFactor);
myRect.anchoredPosition = finalPosition;

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

Надеюсь, это ответит на ваш вопрос.

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