Группа компоновки сетки — Позиции и сортировка дочерних элементов

#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;