2017-12-29 35 views
0

저는 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

코드에 임의의 숫자를 생성하려는 시도가 있습니다. Unity에서 Unity에서 임의의 숫자를 생성하는 방법은 Google뿐입니다. – Programmer

+0

나는 당신이 자식 gameobjects이 무작위로 금액을 무작위로 선택한 다음 다른 태그를 적용 할 수 있을지 궁금 해서요. –

+0

가능합니다. 질문을 편집하고 Unity에서 임의의 숫자를 생성 할 수 있음을 보여줍니다. 그렇게 할 수 없다면 Google에 알려주세요. 일단 당신이이 질문에 당신이 가지고있는 일을하려는 시도를 찾으십시오. 다시 말하지만 그렇게 할 수 없다면 해당 코드를 게시하십시오. – Programmer

답변

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

당신은 당신이 당신의 관리자에서 "숲"태그를했습니다 가정하면 다음

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

각 덩어리에 대한 하나 개의 태그가 필요합니다. 더 많은 정보 here.

즉, 지형으로 간주되는 모든 것들의 목록을 포함하는 TerrainManager 객체를 가지고 배열에 내부적으로 저장하는 것이 더 빠르고 분명 할 수 있습니다. 이렇게하면 더 빨리 액세스하거나 더 매끄러운 액세스를 할 수 있습니다 (행 5, 3 열에 덩어리를 제공하십시오). 도시 건축가를 잼으로 만들면서, 나는 분명히 일하기가 더 쉬워 졌기 때문에 건물을위한이 길로 나아갔습니다.

+0

감사합니다.이 답변은 매우 유용합니다. 알아 내야 할 모든 것은 내가 임의로 선택하는 자식 게임 개체를 찾는 방법입니다. –