如何在丛中随机选择儿童游戏对象

时间:2017-12-29 19:11:27

标签: c# unity3d

我正在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

如果有任何方法可以使这个问题更具体/可理解,我很乐意这样做。谢谢你的帮助。

2 个答案:

答案 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";
    }