【发布时间】:2020-02-22 14:19:24
【问题描述】:
设置如下:
- 一个预制件,其中包含一个带有子图像的游戏对象(A CellPrefab)。当 Cell 被实例化时,它会获得一种随机颜色。
- X x Y 网格单元格。
像素是一个 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));
}
}
请注意,网格包含的对象永远不会移动、调整大小或以其他方式平移,因此是静态的。
挑战是网格的大小难以控制。在我的用例中,我不能低于 100 x 100 的网格。这意味着使用我当前的方法我正在实例化 10.000 个游戏对象只是为了显示网格,并且此时我正在渲染 40.000 个 tris。尝试选择网格中的任何单元格时,Unity 编辑器长时间无响应。
正如您在屏幕截图中看到的那样,每个单元格只是一个带有颜色(随机)的方形图像。
我会欣赏在 Unity 中处理大量游戏对象的一些指示或方法,或者如果有其他方法可以解决这个问题。也许是一种将所有图像“压缩”成一个大但仍保留有关不同单元位置和对象信息的信息的方法。
谢谢!
【问题讨论】:
-
为我们提供屏幕截图以查看您的预制件是如何定义的(以便我们可以在 Unity 编辑器的右侧看到它的所有定义。
-
当然,我已经添加了其他信息。
-
闲逛,你的Cell是不是也需要CanvasRenderer?我只是好奇,不能删除这个组件吗?
-
Image 组件依赖于它。所以我不能不删除 Image 组件就删除
-
是的,但我问的是“Cell”,而不是“base”节点。
标签: c# unity3d optimization gameobject