这里是设置:
并且像素是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));
}
}
请注意,网格所包含的对象将永远不会移动,调整大小或以其他方式转换,因此它们是静态的。
The challenge是网格的大小不可更改。在我的用例中,我不能低于100 x 100网格。这意味着使用我当前的方法实例化10.000个gameObjects只是为了显示网格,此时我要渲染40.000个tris。尝试选择网格中的任何单元格时,Unity编辑器很长时间没有响应。
如您在屏幕截图上所看到的,每个单元格都是带有颜色(随机化)的正方形图像。
我会欣赏一些在Unity中处理大量游戏对象的指针或方法,或者如果有其他方法可以解决此问题。也许是一种将所有图像“压缩”到一个大的方法,但仍然保留有关不同像元位置和对象信息的信息。
谢谢!
我认为通过UI渲染是错误的抽象。
您需要这样考虑:
这是两个非常不同的问题,您正在将它们混为一谈。
在一个简单的二维数组中。
您有一个Cell
类。
每个单元格可能应该具有显示颜色,作为Cell类的公共属性。
然后,您的单元格网格只是一个Cell[,]
对象。
[创建与2D单元阵列相同尺寸的黑色图像循环浏览2D单元阵列。
对于每个x,y单元,将图像的x,y像素颜色更改为该单元的颜色。
完成。现在您有了1个游戏对象,即与2D数组尺寸相同的图像。