Имеется код, который таскает 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. Как сделать любое из этого?
Input.mousePosition хранит свою позицию в координатах экрана, где - левый нижний угол (0,0), а правый верхний - (ширина, высота) разрешения экрана.
(0,0) у anchorPosition зависит от того - куда у вас установлен якорь объекта. Считаются они от родителя. Выберете объект с RectTransform и вы увидите, почти сразу под названием компонента, квадрат с условным обозначением якоря - у вас там будет написано middle - middle по граням и красный крестик с точкой в центре. Точка - условное обозначение (0,0) в координатах родителя.
Нажмите на это поле и у вас откроются возможные преднастроенные варианты привязки. Если вы выберете bottom - left - то (0,0) для вашего объекта станет в левом нижнем углу родителя. Если при этом размер вашего родительского объекта будет соответствовать разрешению экрана - то координатные плоскости объекта и экрана совпадут. В итоге Input.mousePosition и anchorPosition можно будет спокойно подставлять напрямую.
В тех случаях, когда размеры родителя не соответствуют экрану - можно использовать извращённую RectTransformUtility, которая способна превращать экранные координаты в локальные для конкретного RectTransform.
На всякий случай вот вам ещё и статья по основам работы с RectTransform.
Продвижение своими сайтами как стратегия роста и независимости