【问题标题】:How do I instantiate a static grid of UI images in Unity optimally?如何以最佳方式在 Unity 中实例化 UI 图像的静态网格?
【发布时间】:2020-02-22 14:19:24
【问题描述】:

设置如下:

  • 一个预制件,其中包含一个带有子图像的游戏对象(A CellPrefab)。当 Cell 被实例化时,它会获得一种随机颜色。
  • X x Y 网格单元格。

这是预制件:

base 是一个带有图像的游戏对象:

像素是一个 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


【解决方案1】:

我认为通过 UI 呈现这个是错误的抽象。

你需要这样想:

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

这是两个非常不同的问题,你把它们混为一谈了。


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

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

你有一个Cell 类。

每个单元格都应该有一个显示颜色作为 Cell 类的公共属性。

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


2) 我如何向用户展示这个?

创建与二维元胞数组尺寸相同的黑色图像 循环遍历您的二维元胞数组。

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


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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-19
    • 1970-01-01
    • 1970-01-01
    • 2018-03-08
    • 1970-01-01
    • 2012-09-23
    相关资源
    最近更新 更多