Случайные точки на окружности - PullRequest
3 голосов
/ 28 января 2012

Я пытаюсь разработать игру в 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;    
        }
    }
}

Ответы [ 2 ]

7 голосов
/ 28 января 2012

Параметр, передаваемый конструктору 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)
2 голосов
/ 13 декабря 2017

Просто примечание для тех, кто приезжает сюда и ищет случайную точку внутри круга, в частности, в Unity:

Я не знаю, существовал ли он, когда это было впервые опубликовано, но вы можете использовать UnityEngine.Random.insideUnitCircle(), чтобы получить случайную точку внутри круга с радиусом 1. Существует также внутренняя единица для получения случайной точки в 3D. сфера.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...