2012-01-28 56 views
3

我想在Unity中開發一款遊戲,你從2D星球跳到2D星球,每個星球都有自己的引力(技術上游戲是2.5D,但所有運動都沿着X和Y軸)。我想使用參數公式將地雷放置在這些行星的隨機點上;這是我開發的將它們附加到父Planet對象的腳本。然而,地雷並未像預期的那樣出現在圓圈的表面,而是呈現出非常扭曲的形狀。我可能會做錯什麼?Circle上的隨機點

public class LandMine : MonoBehaviour 
{ 
    public GameObject mine; 
    private GameObject landmine; 
    private System.Random rand; 
    private Vector3 pos; 

    List<GameObject> mines; 

    public void Start() 
    { 
     mines = new List<GameObject>(); 
     LevelStart(); 
    } 

    public Vector3 ran() 
    { 
     rand = new System.Random(359); 
     float angle = rand.Next(); 
     float value = angle * (Mathf.PI/180f); 
      float x = (float) (0.5000001 * Mathf.Cos(value)) + 6; 
      float y = (float) (0.5000001 * Mathf.Sin(value)) - 9; 
      return new Vector3(x,y,0); 
    } 

    void LevelStart() 
    { 
     for (int i = 0; i < 5; i++) 
     { 
      pos = ran; 
      mine = Instantiate(mine, pos,Quaternion.identity) as GameObject; 
      mines.Add(mines); 
     } 
     foreach (GameObject m in mines) 
     { 
      m.transform.parent = this.transform;  
     } 
    } 
} 

回答

7

傳遞給Random構造函數的參數是隨機種子,而不是數字範圍。如果您想在每次開始遊戲時生成新的隨機數字,請使用無參數構造函數。另外,只聲明一次隨機數發生器。它使用時鐘來初始化它自己,但由於時鐘滴答非常緩慢(與CPU時鐘頻率相比),如果每次創建一個新實例,它可能會多次生成相同的隨機數。

static readonly Random random = new Random(); 

然後生成

int angle = random.Next(360); // generates numbers in the range 0 ... 359 

double angle = 2.0 * Math.PI * random.NextDouble(); 

爲礦山座標

mineX = centerX + radius * cos(angle) 
mineY = centerY + radius * sin(angle) 
+0

不幸的是,在這些變化之後,礦山仍然在互相之上產生扭曲的形式。 – 2012-01-28 19:14:41

+1

'Instantiate'如何工作? – 2012-01-28 19:37:19

+1

是什麼讓我懷疑'Instantiate'是,來自前一個循環的礦被作爲第一個參數傳遞給它。它是否需要從中獲得新礦的座標?如果你通過'null'會發生什麼? – 2012-02-02 17:48:02

0

只是爲了沒有人來這裏尋找一記公式的新視角得到一個隨機點在Unity中專門圈出一個圓:

我不知道它是否在第一次發佈時存在,但可以使用UnityEngine.Random.insideUnitCircle()在半徑爲1的圓內獲得一個隨機點。還有一個用於獲取3D球體中的隨機點。

希望有所幫助。