Я работаю над игрой в реальном времени с довольно обширным пользовательским интерфейсом, поэтому я переместил вывод основной камеры на четырехугольник, который занимает только половину экрана, а на остальную часть я накладываю некоторые эффекты пользовательского интерфейса. Мой текущий способ взаимодействия с игрой использует Input.mousePosition Unity. Когда я переместил изображение с камеры на квадроцикл, очевидно, что эти координаты пикселей были искажены, поэтому я исправил их следующим образом:
mapMousePos = (Input.mousePosition * mscaleCorr - mapCorrection * mscaleCorr);
mapCorrection — это смещение в пикселях меньшего канала, а mscaleCorr — магическое число, полученное путем проб и ошибок — временное исправление.
Дело в том, что теперь я понимаю, что запуск этой игры с другим разрешением почти наверняка нарушит эти магические числа.
Я хочу, чтобы mapMousePos был таким же, каким был Input.mousePosition до того, как я перенес игровой процесс на маленький четырехугольник — переход от (0,0) в левом нижнем углу четырехугольника к экрану (ширина, высота) в правом верхнем углу. четверка Это просто так, он очень хорошо работает с точкой screenToWorld на моей игровой камере.
У меня есть четырехугольник с камерой, связанный с полноэкранным четырехугольником, и я пытался использовать их относительные положения для применения необходимых преобразований, но это не сработало, я предполагаю, потому что это проблема с пикселями.
Я безуспешно копался в документах в поисках решения, использующего встроенную в Camera функцию worldToScreenPoint. Я уверен, что в конце концов наткнусь на исправление, но был бы очень признателен за любые указатели.
Вот что я придумал; это глупо, но это работает.
Я разместил объекты внизу слева и вверху справа от четырехугольника, сохранив их в коде как bL и tR.
Затем я конвертирую mousePosition в worldPosition с помощью ScreenToWorldPoint(), переназначаю его, вычитая нижнюю левую позицию, и получаю ее в процентах по экрану, разделив ее на дельту вверху справа. Умножьте процент на пиксельные размеры игровой камеры и вуаля.
В коде это:
Vector3 wPos = finalcam.ScreenToWorldPoint(Input.mousePosition);
wPos -= bL.transform.position;
mapMousePos = new Vector2(Mathf.Abs(wPos.x), Mathf.Abs(wPos.y));
mapMousePos = new Vector2(
mapMousePos.x / (tR.transform.position.x -bL.transform.position.x),
mapMousePos.y / (tR.transform.position.y - bL.transform.position.y));
mapMousePos = new Vector2(mapMousePos.x * Camera.main.pixelWidth, mapMousePos.y * Camera.main.pixelHeight);
Опять же, это глупо, но, похоже, работает. Я оставляю это на случай, если кто-нибудь знает более чистый метод.
Ваш вопрос может нуждаться в диаграмме, чтобы помочь объяснить вещи.