2016-12-06 95 views
1

目前,我有兩個隨機圍繞一個圓圈產卵的球,它們之間的最小距離爲0.3,因此它們不會相互碰撞。但是,我希望玩家設定產卵量,我需要這些球隨機產卵,但距離彼此最小。在距離彼此最小距離的圓上隨機產生數量的GameObjects

用我的代碼,大於2的球數量可能有兩個球互相重疊的機會,因爲我只參考了最後一個產卵球的位置spawnConstant

當我試圖找出數組,我遇到了同樣的問題,只有位置指向陣列中的一個位置。附件是當前代碼:

IEnumerator SpawnBalls() { 

    Vector3 spawnConstant = new Vector3(); 
    Vector3 spawnPosition = new Vector3(); 

    for (int i = 0; i < ballNumber; i++) { 

     if (i == 0) { 

      spawnPosition = Random.insideUnitCircle.normalized * 0.7f; 
      Instantiate (ball, spawnPosition, Quaternion.identity); 
      Debug.Log ("wolo"); 
      spawnConstant = spawnPosition; 

     } else if (i > 0) { 

      spawnPosition = Random.insideUnitCircle.normalized * 0.7f; 

      while (Vector3.Distance (spawnPosition, spawnConstant) <= 0.3f) { 
       spawnPosition = Random.insideUnitCircle.normalized * 0.7f; 
      } 

      spawnConstant = spawnPosition; 
      Instantiate (ball, spawnPosition, Quaternion.identity); 
      Debug.Log ("yolo"); 
     } 
    } 
    yield return null; 
} 

我怎樣才能讓每一個球是指所有前兩者的位置,並從中產生一個最小距離?

回答

1
IEnumerator SpawnBalls() { 

    Vector3[] ballArray = new Vector3[ballNumber]; 
    Vector3 spawnPosition = new Vector3(); 

    int index = 0; 

    for (int i = 0; i < ballNumber; i++) { 

     // Create first ball and store coordinates into our ballArray at index 0 
     if (i == 0) { 

      spawnPosition = Random.insideUnitCircle.normalized * 0.7f; 
      Instantiate (ball, spawnPosition, Quaternion.identity); 
      Debug.Log ("wolo"); 
      ballArray[index] = spawnPosition; 

     // Else we already have one ball 
     } else if (i > 0) { 
      // Create new spawn coordinates 
      spawnPosition = Random.insideUnitCircle.normalized * 0.7f; 

      // Loop through indicies of array that have been filled 
      for(int k = 0; k <= index; k++) { 
       // Check that each value in array meets distance requirement 
       if(Vector3.Distance (spawnPosition, ballArray[k]) <= 0.3f) { 
       // If not, create new coordinates and reset k 
       spawnPosition = Random.insideUnitCircle.normalized * 0.7f; 
       k = 0; 
      } 

      // Update array 
      ballArray[index++] = spawnPosition; 

      Instantiate (ball, spawnPosition, Quaternion.identity); 
      Debug.Log ("yolo"); 
     } 
     } 
     yield return null; 
    }