如何在Unity中最佳地实例化UI图像的静态网格?

问题描述 投票:0回答:1

这里是设置:

  • 包含游戏对象和子图像的Prefab(A CellPrefab)。实例化单元格时,它会获得随机颜色。
  • 单元格的X 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));
   }

}

请注意,网格所包含的对象将永远不会移动,调整大小或以其他方式转换,因此它们是静态的。

The challenge是网格的大小不可更改。在我的用例中,我不能低于100 x 100网格。这意味着使用我当前的方法实例化10.000个gameObjects只是为了显示网格,此时我要渲染40.000个tris。尝试选择网格中的任何单元格时,Unity编辑器很长时间没有响应。

25 by 25 grid

如您在屏幕截图上所看到的,每个单元格都是带有颜色(随机化)的正方形图像。

我会欣赏一些在Unity中处理大量游戏对象的指针或方法,或者如果有其他方法可以解决此问题。也许是一种将所有图像“压缩”到一个大的方法,但仍然保留有关不同像元位置和对象信息的信息。

谢谢!

c# unity3d optimization gameobject
1个回答
0
投票

我认为通过UI渲染是错误的抽象。

您需要这样考虑:

  1. 如何存储单元格的信息?
  2. 如何向用户显示单元格?

这是两个非常不同的问题,您正在将它们混为一谈。


1)如何存储单元格的信息?

在一个简单的二维数组中。

您有一个Cell类。

每个单元格可能应该具有显示颜色,作为Cell类的公共属性。

然后,您的单元格网格只是一个Cell[,]对象。


2)如何显示给用户?

[创建与2D单元阵列相同尺寸的黑色图像循环浏览2D单元阵列。

对于每个x,y单元,​​将图像的x,y像素颜色更改为该单元的颜色。


完成。现在您有了1个游戏对象,即与2D数组尺寸相同的图像。

© www.soinside.com 2019 - 2024. All rights reserved.