Заставить Input.MousePosition проходить через ноль

168
13 января 2020, 20:50

Имеется код, который таскает UI объект за мышкой по клеточкам,каждая клеточка 25 юнити метров.

int i = (int)Math.Round(Input.mousePosition.x / 25) * 25;
discreteX = i;
int j = (int)Math.Round(Input.mousePosition.y / 25) * 25;
discreteY = j;
g.transform.GetComponent<RectTransform>().anchoredPosition = 
new Vector3(discreteX, discreteY);

Он работает хорошо, и anchoredPosition.x всегда проходит через 0 и затем становится +25,+50,+75 и так далее.

А проблема в том что координаты мышки не совпадают с координатами объекта g, , например, когда мышка болтается в нуле - т.е. в нижнем левом углу, объект g находится в центре экрана, где у него ноль по его anchorPosition

В случае же, если вместо anchoredPositon мы используем обычное присвоение по координатам

g.transform.position = new Vector3(discreteX, discreteY);

то позиция курсора мышки и объекта g совпадает, но никогда не проходит через 0 его anchoredPosition - всегда по координатам x вижу картину вида -35,-10,15,40 и так далее. Т.е. шаг по прежнему равен 25, но не кратен 25!

Как решить данную проблему? Либо мышку совместить с координатами anchoredPosition, либо обычную позицию мышки с шагом в 25 единиц держать кратным 25. Как сделать любое из этого?

Answer 1

Input.mousePosition хранит свою позицию в координатах экрана, где - левый нижний угол (0,0), а правый верхний - (ширина, высота) разрешения экрана.

(0,0) у anchorPosition зависит от того - куда у вас установлен якорь объекта. Считаются они от родителя. Выберете объект с RectTransform и вы увидите, почти сразу под названием компонента, квадрат с условным обозначением якоря - у вас там будет написано middle - middle по граням и красный крестик с точкой в центре. Точка - условное обозначение (0,0) в координатах родителя.

Нажмите на это поле и у вас откроются возможные преднастроенные варианты привязки. Если вы выберете bottom - left - то (0,0) для вашего объекта станет в левом нижнем углу родителя. Если при этом размер вашего родительского объекта будет соответствовать разрешению экрана - то координатные плоскости объекта и экрана совпадут. В итоге Input.mousePosition и anchorPosition можно будет спокойно подставлять напрямую.

В тех случаях, когда размеры родителя не соответствуют экрану - можно использовать извращённую RectTransformUtility, которая способна превращать экранные координаты в локальные для конкретного RectTransform.

На всякий случай вот вам ещё и статья по основам работы с RectTransform.

READ ALSO
DataGridViewAutoFilter и BindingList

DataGridViewAutoFilter и BindingList

Вот так заполняю грид:

195
Как сделать поиск массиве и отображение в компоненте ComboBox?

Как сделать поиск массиве и отображение в компоненте ComboBox?

Как сделать поиск массиве и отображение в компоненте ComboBox? По примеру поисковика Google

185
Комментируется любой php код как исправить?

Комментируется любой php код как исправить?

Подскажите пожалуйстаИнспектирую элемент

230
Ссылки из меню wordpress

Ссылки из меню wordpress

Есть ли возможность получить урлы произвольных ссылок из меню?

196