Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 圆上的随机点_C#_Unity3d_Scripting_Geometry - Fatal编程技术网

C# 圆上的随机点

C# 圆上的随机点,c#,unity3d,scripting,geometry,C#,Unity3d,Scripting,Geometry,我试图在Unity中开发一个游戏,你从一个2D星球跳到另一个2D星球,每个星球都有自己的引力(从技术上讲,游戏是2.5D的,但所有的运动都是沿着X轴和Y轴)。我想使用参数公式在这些行星上的随机点放置地雷;这是我开发的脚本,用于将它们附加到父行星对象。然而,地雷并没有像预期的那样出现在圆圈的表面,而是在形状上显得非常扭曲。我可能做错了什么 public class LandMine : MonoBehaviour { public GameObject mine; private

我试图在Unity中开发一个游戏,你从一个2D星球跳到另一个2D星球,每个星球都有自己的引力(从技术上讲,游戏是2.5D的,但所有的运动都是沿着X轴和Y轴)。我想使用参数公式在这些行星上的随机点放置地雷;这是我开发的脚本,用于将它们附加到父行星对象。然而,地雷并没有像预期的那样出现在圆圈的表面,而是在形状上显得非常扭曲。我可能做错了什么

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)