#c# #unity3d #scaling #grid-layout
Вопрос:
Привет, коллеги-программисты,
Во-первых, я хочу объяснить цель моей задачи, которая заключается в создании интерактивной сетки пользовательского интерфейса, в которой пользователь может выбрать любой интересующий его элемент сетки. (Это уже сделано, используя группу компоновки сетки — см. Прикрепленное изображение)
Вся сетка должна представлять квадратную область реального размера, которую я получаю из данных, состоящих из длины и ширины. Из данных у меня также есть список событий, который содержит определенные события в реальной жизни и данные о местоположении (x,y) каждого события. Поэтому, когда пользователь выбирает элемент сетки, я хочу, чтобы он представлял все события, равные в пределах этого позиционного диапазона.
Моя идея: до сих пор заключается в том, чтобы найти метод расчета, позволяющий получить размер сетки пользовательского интерфейса относительно реального размера. Но мне нужен способ на самом деле получить размер сетки (без жесткого кодирования). А затем получите доступ и отсортируйте каждый дочерний элемент, чтобы, если элемент, который был нажат на прикрепленном изображении, был равен (0,0), (0,1) и (0,2), чтобы я мог перебирать каждый дочерний элемент
Я знаю, что это запутанное объяснение, но я надеюсь, что в нем есть хоть какой-то смысл.
Ответ №1:
Я думаю, вам нужны следующие расчеты:
Учитывая TotalWidth
, TotalHeight
и CellWidth
, CellHeight
вашу сетку и а Position
внутри TotalWidth/TotalHeight
. Где totalWidth-это ширина X вашей сетки, ширина ячейки-ширина X ваших ячеек, расположите позицию в вашей сетке.
CellIndexX = Position.X % (TotalWidth / CellWidth);
CellIndexY = Position.Y / (TotalHeight / CellHeight);
TotalWidth / CellWidth
в основном вычисляется количество ячеек по оси X, и то же самое происходит с количеством ячеек по оси Y.
Это должно затем позволить вам получить ячейку по индексу, например:
int TotalWidth = 4000;
int TotalHeight = 2000;
int CellWidth = 20; // TotalWidth / CellWidth = 4000/20 = 200 grid tiles on the x-Axis
int CellHeight = 20; // TotalWidth / CellWidth = 4000/20 = 100 grid tiles on the y-Axis
Cell[,] myGrid;
Cell GetCellForPosition(Vector3 Position)
{
CellIndexX = Position.X % (TotalWidth / CellWidth);
CellIndexY = Position.Y / (TotalHeight / CellHeight);
Cell result = myGrid[CellIndexY, CellIndexX];
return resu<
}
Для сравнения размера реального мира с размером сетки вы можете использовать правило трех. Или, проще говоря, вы просто придумываете фактор
Если размер реального мира равен: 120X meters * 90Y meters
и вы хотите, чтобы сетка была 100X
в метрах , ваш коэффициент будет равен: 100/120 = 0.8333
, который затем вы можете использовать для вычисления высоты Y вашей сетки по: YGridHeight = 90 * 0.833 = 75;