2012-01-28 58 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球体中的随机点。

希望有所帮助。