C# 圆上的随机点
我试图在Unity中开发一个游戏,你从一个2D星球跳到另一个2D星球,每个星球都有自己的引力(从技术上讲,游戏是2.5D的,但所有的运动都是沿着X轴和Y轴)。我想使用参数公式在这些行星上的随机点放置地雷;这是我开发的脚本,用于将它们附加到父行星对象。然而,地雷并没有像预期的那样出现在圆圈的表面,而是在形状上显得非常扭曲。我可能做错了什么C# 圆上的随机点,c#,unity3d,scripting,geometry,C#,Unity3d,Scripting,Geometry,我试图在Unity中开发一个游戏,你从一个2D星球跳到另一个2D星球,每个星球都有自己的引力(从技术上讲,游戏是2.5D的,但所有的运动都是沿着X轴和Y轴)。我想使用参数公式在这些行星上的随机点放置地雷;这是我开发的脚本,用于将它们附加到父行星对象。然而,地雷并没有像预期的那样出现在圆圈的表面,而是在形状上显得非常扭曲。我可能做错了什么 public class LandMine : MonoBehaviour { public GameObject mine; private
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;
}
}
}
公共级地雷:单一行为
{
公共游戏对象地雷;
私人游戏对象地雷;
私人系统。随机兰德;
私人矢量3位置;
列出地雷清单;
公开作废开始()
{
地雷=新名单();
LevelStart();
}
公共向量3 ran()
{
兰德=新系统随机(359);
浮动角度=rand.Next();
浮动值=角度*(数学PI/180f);
浮点数x=(浮点数)(0.5000001*Mathf.Cos(值))+6;
浮点数y=(浮点数)(0.5000001*Mathf.Sin(值))-9;
返回新矢量3(x,y,0);
}
void LevelStart()
{
对于(int i=0;i<5;i++)
{
pos=ran;
mine=实例化(mine、pos、Quaternion.identity)作为游戏对象;
地雷。增加(地雷);
}
foreach(矿山中的游戏对象m)
{
m、 transform.parent=this.transform;
}
}
}
传递给随机构造函数的参数是随机种子,而不是数字的范围。如果每次开始游戏时都要生成新的随机数,请使用无参数构造函数。另外,仅声明一次随机数生成器。它使用时间时钟来初始化自身,但由于时钟滴答声非常慢(与CPU时钟频率相比),如果每次创建一个新实例,它可能会多次生成相同的随机数
static readonly Random random = new Random();
然后使用
int angle = random.Next(360); // generates numbers in the range 0 ... 359
或
矿山坐标的公式如下:
mineX = centerX + radius * cos(angle)
mineY = centerY + radius * sin(angle)
请注意,来这里的任何人都希望在一个圆内获得一个随机点,特别是在统一中: 我不知道它在第一次发布时是否存在,但您可以使用
UnityEngine.Random.InsideuUnitCircle()
获取半径为1的圆内的随机点。还有一个用于获取3D球体中随机点的insideUnitSphere
希望这能有所帮助。不幸的是,在这些更改之后,地雷仍然以扭曲的形式相互叠加生成。让我怀疑的是,
实例化
的原因是,上一个循环中的地雷作为第一个参数传递给它。它会从中获取新矿井的坐标吗?如果改为传递null
,会发生什么?如何传递2.0*Math.PI*random.NextDouble()代码>做与随机相同的工作。下一步(360)代码>?它没有。这只是两个不同的例子。一个用于int
,一个用于double
。int
示例返回[0..359]范围内的整数,其中double
示例返回[0.0..2*Pi]范围内的实数,上限除外。
mineX = centerX + radius * cos(angle)
mineY = centerY + radius * sin(angle)