2016-11-17 7 views
2

나는 잠시 동안 인터넷 검색을하고 있었지만, 무엇을 찾아야할지 모르기 때문에 좋은 사람들에게 도움을 요청할 것입니다.Unity : 절차 적으로 생성 된지도에서 적을 산란하기

첫 번째 게임의 절차 단계 제작자로 일하고 있습니다. 코드의 일부는 여기 튜토리얼에서 영감을 얻었지만 최대한 많은 노력을 기울였습니다. 어쨌든, 여기에 내가 지옥으로 아마 추한 인 도움이 필요 코드, 그리고 난 후 도움이 필요 무엇을 설명 할 것이다 :

Vector3 RandomPosition() 
{ 
    int randomIndex = Random.Range (0, gridPositions.Count); 

    Vector3 randomPosition = gridPositions [randomIndex]; 

    gridPositions.RemoveAt (randomIndex); 

    return randomPosition; 
} 


void LayoutObjectAtRandom (GameObject[] tileArray, int minimum, int maximum) 
{ 
    int objectCount = Random.Range (minimum, maximum); 

    for (int i = 0; i < objectCount; i++) 
    { 
     Vector3 randomPosition = RandomPosition(); 

     GameObject tileChoice = tileArray [Random.Range (0, tileArray.Length)]; 

     Instantiate (tileChoice, randomPosition, Quaternion.identity); 
    } 
} 

void spawnTomcats() // Figure out a way to use the RandomPosition to exclude used tiles in enemySpawn 
{ 
    int enemyCount = (int)Mathf.Log (level, 2f); 

    for (int i = 0; i < enemyCount; i++) 
    { 
     Vector3 enemySpawn = new Vector3 (columns + (Random.Range (0, 5)), rows - (Random.Range (7, 14)), 0f); 

     GameObject tileChoice = enemyTiles [Random.Range (0, enemyTiles.Length)]; 

     Instantiate (tileChoice, enemySpawn, Quaternion.identity); 
    } 

public void SceneSetup (int level) 
{ 
    BoardSetup(); 
    InitialiseList(); 
    spawnTomcats(); 

    LayoutObjectAtRandom (impassableObjects, impassableCount.minimum, impassableCount.maximum); 

    Instantiate (heatCat, new Vector3 (columns - 8, rows - (Random.Range(7, 14)), 0f), Quaternion.identity); 
} 
} 

그럼, 내가 필요로하는 것은 선택할 수있는 "Vector3 enemySpawn"입니다 지정된 파라미터 내의 타일. 다만, SceneSetup 함수로 impassableObject를 인스턴스화하는 것으로 아직 사용되어 있지 않다. 모든 것은 산란 부분에서 작동하지만 내 "톰캣 (Tomcats)"은 때로는 공격 할 수없는 대상 위에 산란합니다. RandomPosition() 메서드를 여러 가지 방법으로 통합하려고했지만 실제로 성공하지 못했습니다.

내 변수와 같은 추가 정보가 필요하면 알려주십시오. 나는 아직도 초보자로서 얼마나 필요한지 잘 모르겠다.

모든 조언을 주시면 감사하겠습니다.

조엘 크로스비.

+0

내 대답이 도움이된다면 받아 들일 수있는 것으로 표시하는 것을 잊지 말고, 알려 주시면 자세히 설명 드리겠습니다. –

+0

나는 잊지 않았으며 잊지 않을 것입니다. 제대로 작동하도록하고 싶기 때문에 동시에 내 솔루션을 게시 할 수 있습니다. 당신의 게시물은 나 자신이 해결할 수있는 충분한 관점을주었습니다. 그래서 그것에 대해 감사드립니다. –

답변

1

아마도 가장 좋은 방법은 List<Vector3> ImpassibleObjects을 유지하고 새 바람둥이를 인스턴스화하기 전에 확인하는 것입니다. 주변에 약간의 공간이 포함 된 것 같습니다. 의 라인을 따라

뭔가 :

foreach (Vector3 impLoc in ImpassibleObjects) 
{ 
    if (randomPosition - impLoc < threshold) 
    { 
      CalculateNewRandomPositionAndRecheck(); 
    } 
} 

작동합니다, 행운을 빌어 요!

+0

하루를 제대로 보내려고 애 쓰지만 실제로 얻을 수는 없습니다. List objectPositions를 만든 다음 RandomPosition() 메서드에서 gridPosition.RemoveAt() 바로 위에 objectPositions.Add (randomPosition)를 수행했지만 enemySpawn에 대해 objectPositions를 측정하는 방법을 얻지 못했습니다. 내가 뭘 할지라도 아무 것도 산란하지 않게됩니다. 나는 문질렀다. 알아. –

+0

두 개의 'Vector3' 사이의 거리를 구하려면 상대방의 절대 값을 뺍니다. 귀하의 '임계 값'은 사용자가 결정해야하며 사용자가 사용할 수없는 객체가 포함 된 원의 반지름보다 약간 커야합니다. 그러면 새 산란 위치가 목록에있는 항목의 경계 내에 있지 않은지 확인하는 간단한 문제입니다. 새 코드를 첨부하면 어떤 일이 잘못 될지 알 수 있습니다. –