2017-12-29 43 views
0

私はUnity3D、C#の単純な村のビルドゲームに取り組んでいます。私はそれを作って、ゲームはプレハブのクローンである50x50ブロックの地面を生成するでしょう。どのようにして芝生の塊(各別個のゲームオブジェクト)を脚本(別のタグを付けること)によって森に分類するのですか?ランダムに子供のgameobjectsを選択する方法

現在のスクリプト:

//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

コードには、乱数を生成しようとしました。 Unityで乱数を生成する方法をGoogleに教えてください。 – Programmer

+0

私はちょうど子供のgameobjectsのこのランダムな量をランダムに選択し、次にそれらに異なるタグを適用することができるだろうと思っています。 –

+0

可能です。質問を編集し、Unityで乱数を生成できることを示します。あなたがそれを行うことができない場合、それをGoogleに。この質問であなたがしていることをやろうとする試みをしたら、繰り返しますが、できない場合は、そのコードを投稿してください。 – Programmer

答えて

0

ユニティの回答者のコミュニティメンバーがこの問題を解決しました。利用可能な選択肢からランダムな子インデックス番号が得られ、その子を取得してリストに追加します。また、繰り返し選択が繰り返されないようにします。

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"; 
    } 
0

あなただけがあなたのインスペクタで「森」タグを作ったと仮定すると、その後

groundChild.tag = "Forest"; 
// and search for them later on 
GameObject.FindGameObjectsWithTag("Forest"); 

各塊に1個のタグを、必要な場合。詳細情報here

TerrainManagerオブジェクトには地形とみなされるすべてのもののリストが含まれていて、それらを内部的に配列に格納する方が速く、より明確になるかもしれません。このようにして、より速くアクセスできるようになります(5行目、3列目のクランプを利用可能にしてください)。私の街づくり者を渋滞に陥らせてしまったので、私は仕事のためにこの道を行くことになりました。

+0

ありがとうございます。この回答は非常に役に立ちます。私が把握しなければならないのは、どの子供のゲームオブジェクトをランダムに選択するかを見つける方法だけです。 –

関連する問題