c# - 圆上的随机点

标签 c# unity3d scripting geometry

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

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;    
        }
    }
}

最佳答案

您传递给 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)

关于c# - 圆上的随机点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9047561/

相关文章:

c# - 在 ASPX 页面中动态构建 JavaScript 的方法?

c# - 实现此业务规则的最佳地点?

c# - 更改 @RenderBody 以指向不同的 View MVC3

c# - 一个接一个改变标签的颜色

C# Regex 将 aabbccddeeff 匹配为两个 aabbcc 和 ddeeff 集

c++ - GraphicsMagick.NET 缺少 CORE_RL_bzlib_.lib 文件,C++ 链接器错误?

c# - 如何在不知道速度的情况下计算轨迹的角度

c# - 在下拉项中添加单个图像

linux - 删除包含多个单词的行

windows - 如何在批处理脚本中的多个文件上重命名和添加递增数字后缀?