有没有一种方法可以将GameObjects放置在网格模式(类似于tilemap)中?

时间:2019-04-09 14:46:53

标签: c# unity3d

我对团结还很陌生,所以如果我用怪异的口吻来表达歉意。

我正在尝试创建一个较大的区域,每个“砖块”都有机会生成随机对象。我可以将它用于单个空的GameObject,但是要制作一个较大的网格将需要一遍又一遍地复制/粘贴同一对象并设置其位置。

2 个答案:

答案 0 :(得分:1)

位于Official Documentation上:

  

以特定模式放置一堆对象假设您要   将一堆对象放置成网格或圆形图案。传统上   可以通过以下任何一种方式完成:

     

完全通过代码构建对象。这很乏味!进入   脚本中的值既缓慢,直观又不值得   麻烦。制作完全绑定的对象,将其复制并放置   在场景中多次。这很繁琐,并且放置对象   准确地在网格中很难。所以将Instantiate()与Prefab一起使用   代替!我们认为您知道为什么预制件在   这些情况。以下是这些情况所需的代码:

// Instantiates a prefab in a circle

public GameObject prefab;
public int numberOfObjects = 20;
public float radius = 5f;

void Start() 
{
    for (int i = 0; i < numberOfObjects; i++)
    {
        float angle = i * Mathf.PI * 2 / numberOfObjects;
        Vector3 pos = new Vector3(Mathf.Cos(angle), 0, Mathf.Sin(angle)) * radius;
        Instantiate(prefab, pos, Quaternion.identity);
    }
}



// Instantiates a prefab in a grid

public GameObject prefab;
public float gridX = 5f;
public float gridY = 5f;
public float spacing = 2f;

void Start()
{
    for (int y = 0; y < gridY; y++) 
    {
        for (int x = 0; x < gridX; x++)
        {
            Vector3 pos = new Vector3(x, 0, y) * spacing;
            Instantiate(prefab, pos, Quaternion.identity);
        }
    }
} 

答案 1 :(得分:0)

为了补充 Chico3001 提供的出色答案,文档确实提供了关于如何使用块预制件制作墙壁的非常好的解释。用在 x 轴上旋转 90 度的四元数替换块将创建一个平面图块,并调整代码以便您使用 z 轴而不是 y 轴将其展开。这是代码,from the same section of the manual 引用了 Chico3001:

 using UnityEngine;
public class Wall : MonoBehaviour
{
   public GameObject block;
   public int width = 10;
   public int height = 4;
  
   void Start()
   {
       for (int y=0; y<height; ++y)
       {
           for (int x=0; x<width; ++x)
           {
               Instantiate(block, new Vector3(x,y,0), Quaternion.identity);
           }
       }       
   }
}