我正在Unity3D,C#中开展一个简单的村庄建设游戏。我做到了,所以游戏会生成一个50x50的地面块,这是一个预制克隆。我怎样才能让它如此丛生的草(每个单独的游戏对象)通过脚本被分类为森林(通过给它一个不同的标签)?
当前脚本:
//GameObjects
public GameObject cube;
public GameObject groundParent;
//Integers
public int worldWidthX;
public int worldWidthZ;
public int mapHeight;
//Floats
private float mapSizeX;
private float mapSizeZ;
public void GenerateTerrain()
{
for(int x = 0; x <= this.worldWidthX; x++, x++)
{
for(int z = 0; z <= this.worldWidthZ; z++, z++)
{
float y = /*Mathf.PerlinNoise(x / 30, 76) * Mathf.PerlinNoise(z / 30, 22) * 40;*/ mapHeight;
GameObject groundChild = Instantiate(this.cube, new Vector3(x, y, z), this.cube.transform.rotation);
groundChild.transform.parent = groundParent.transform;
}
}
forestMaxAmount = (worldWidthX * worldWidthZ) / 8;
forestMinAmount = (worldWidthX * worldWidthZ) / 25;
forestAmount = Mathf.RoundToInt(Random.Range (forestMinAmount, forestMaxAmount));
Debug.Log (forestAmount);
}
层次结构: http://prntscr.com/htx5gc
如果有任何方法可以使这个问题更具体/可理解,我很乐意这样做。谢谢你的帮助。
答案 0 :(得分:0)
如果每个丛只需要一个标签,那么
groundChild.tag = "Forest";
// and search for them later on
GameObject.FindGameObjectsWithTag("Forest");
假设您在检查员中制作了“Forest”标签。更多信息here。
也就是说,要么拥有一个TerrainManager对象可能会更快更清晰,该对象包含您认为是地形的所有事物的列表,并将它们内部存储在数组中。通过这种方式,您可以更快地访问或更高级访问(在第5行,第3列,如果可用的话,给我一丛)。为了让我的城市建设者成为一个果酱,我最终走上了建筑物的这条路线,因为它更容易使用。
答案 1 :(得分:0)
Unity答案网站上的社区成员为我的问题提供了此解决方案。它从可用选项中提供一个随机子索引号,然后获取该子项,将其添加到列表中。它还确保重复选择不会再次重复。
HashSet<int> alreadyChosen = new HashSet<int>();
for (var i = 0; i <= forestAmount; i++)
{
int randomChildIdx = Random.Range(0, groundParent.transform.childCount);
while (alreadyChosen.Contains(randomChildIdx))
randomChildIdx = Random.Range(0, groundParent.transform.childCount);
alreadyChosen.Add(randomChildIdx);
Transform randomChild = groundParent.transform.GetChild(randomChildIdx);
// randomChild is now a random child of groundParent. Do whatever you need to with it.
forestObjects.Add(randomChild);
randomChild.tag = "Forest";
}