Как оптимальным образом создать сетку изображений пользовательского интерфейса c в Unity? - PullRequest
0 голосов
/ 22 февраля 2020

Вот настройки:

  • Префаб, который содержит игровой объект с дочерним изображением (CellPrefab). Когда создается экземпляр ячейки, она получает случайный цвет.
  • Сетка ячеек X по Y.

Вот префаб: Cell Prefab

Где база - игровой объект с изображением: enter image description here

, а пиксель - белая точка 1x1.

И код ячейки:

using UnityEngine;
using UnityEngine.UI;

public class Cell : MonoBehaviour
{
    private void Start()
    {
        GetComponent<Image>().color = Random.ColorHSV(0f, 1f, 0f, 1f, 0f, 1f);
    }
}

Код для сетки:

public class Grid
{
  public Grid(int width, int height, float cellSize, Cell CellPrefab, Canvas canvas)
   {
      this.cellSize = cellSize;
      oneCell = CellPrefab;
      gridArray = new int[width,height];
      cellContentArray = new Cell[width,height];

      for (var x = 0; x < Width; x++)
      {
         for (var y = 0; y < Height; y++)
         {
            CreateCell(x, y, GetWorldPosition(x,y) + new Vector2(cellSize,cellSize)*0.5f, canvas);
         }
      }
   }

      private void CreateCell(int x, int y, Vector2 position, Canvas canvas)
   {
      var cell = Object.Instantiate(oneCell, position, Quaternion.identity, canvas.transform);
      cell.transform.localPosition = position;
      cell.name = $"[{x},{y}]";
      cellContentArray[x, y] = cell;
   }

     private Vector2 GetWorldPosition(int x, int y)
   {
      return new Vector2(x * cellSize - (Width*cellSize/2f),y * cellSize - (Height*cellSize/2f));
   }

}

Обратите внимание, что объекты, содержащиеся в сетке, никогда не будут перемещаться, изменяться в размерах или иным образом переводиться и, таким образом, сохраняются c.

Проблема заключается в том, что размер сетки неуправляем. В моем случае я могу go не ниже сетки 100 на 100. Это означает, что, используя мой текущий метод, я создаю 10 000 объектов gameObjects просто для того, чтобы показать сетку, и на этом этапе я отрисовываю 40 000 трис. Редактор Unity долго не отвечает при попытке выбрать любую из ячеек в сетке.

25 by 25 grid

Как вы можете видеть на скриншоте, каждая ячейка представляет собой только квадратное изображение с цветом (рандомизированным).

Я бы оценил некоторые указатели или способы работы с большим количеством игровых объектов в Unity или, если есть целый другой как я могу go об этой проблеме. Может быть, это способ "сква sh" всех изображений в одно большое, но при этом хранить информацию о различных положениях ячеек и информацию об объектах.

Спасибо!

1 Ответ

1 голос
/ 24 февраля 2020

Я думаю, что рендеринг через UI - неправильная абстракция.

Вам нужно думать об этом так:

  1. Как я могу хранить информацию для ячеек?
  2. Как я могу показать ячейки пользователю?

Это две очень разные проблемы, и вы их объединяете.


1) Как я могу хранить информацию для клеток?

В простом 2d массиве.

У вас есть Cell класс.

Каждая ячейка, вероятно, должна иметь цвет отображения как свойство publi c класса Cell.

Тогда ваша сетка ячеек - это просто Cell[,] объект.


2) как я могу показать это пользователям?

Создать черное изображение с такими же размерами, что и у двумерного массива ячеек L oop, через свой двумерный массив ячеек.

для каждого x, y ячейка, вы меняете цвет пикселя x, y на цвет ячейки.


Готово. Теперь у вас есть 1 игровой объект, изображение того же размера, что и ваш 2D массив.

...