2017-02-17 14 views
0

Я запрограммировал небольшой клон-клон. В начале мяч появляется в середине поля.Unity Random Range не работает должным образом

Ожидаемый результат: Я хочу, чтобы мяч лететь в 45 градусов к верхней правой и левой, и правой нижней и левой случайно.

Реальный выход: Мяч находится только в правом верхнем и нижнем левом углу.

Код:

public class BallController : MonoBehaviour { 

public float speed; 
private Rigidbody2D rb2d; 
private int counter; 

void Start() { 
    rb2d = GetComponent<Rigidbody2D>(); 
    SetStartPosition(); 
} 


public void SetStartPosition() { 
    this.transform.position = new Vector3 (395f, 295f, 0f); 
    int xVector = GetRandom(); 
    int yVector = GetRandom(); 
    float x = (float) xVector; 
    float y = (float) yVector; 
    Vector2 movement = new Vector2 (x, y); 
    rb2d.velocity = movement * speed; 
} 

private int GetRandom() { 
    int i = 0; 
    do { 
     Random.InitState((int) System.DateTime.Now.Ticks); 
     i = Random.Range (-1, 2); 
    } while (i == 0); 
    return i; 
} 

} 
+0

Уверены ли вы? Я попробовал код и получил все возможные значения. Вы можете выполнить легкий тест с помощью (int i = 0; i <100; i ++) {print (GetRandom() + "" + GetRandom());} в Start. И вам не нужен Random.InitState ((int) System.DateTime.Now.Ticks), который используется для установки семени, и вы обычно устанавливаете его один раз, если хотите каждый раз получать одинаковый результат. –

+0

Подождите, я нашел проблему. Это был Random.InitState ((int) System.DateTime.Now.Ticks) –

ответ

0

Удалить линию Random.InitState((int) System.DateTime.Now.Ticks)InitState используется для установки семени и, как правило, только один раз, чтобы получить тот же результат каждый раз. Кажется, что, устанавливая семя каждый раз, когда он возвращает те же значения (или те же 2 выхода).

1

Random.InitState предназначен для использования в случайном двигателе. Случайные числа из класса Random не являются случайными как таковые, они равны pseudo-random. Псевдослучайные числа детерминированы; если вы вызываете Random.InitState с тем же семенем, а затем вызываете Random.Range с теми же аргументами, вы всегда получите одинаковое значение. Поскольку вы вызываете GetRandom дважды так близко друг к другу, вы, вероятно, пересаживаете движок на одно и то же значение (или близко к нему), чтобы затем получить случайное число, такое же, как и последнее. Вы должны засеять свой двигатель только один раз. This is covered in the Unity documentation. На самом деле, в соответствии с документацией:

Семя обычно устанавливается от некоторой произвольной величины, как системного тактового сигнала, прежде чем используются функции случайных чисел. Это предотвращает появление одинакового запуска значений при каждом воспроизведении игры и, таким образом, позволяет избежать предсказуемого геймплея. Однако иногда бывает полезно выполнить один и тот же запуск псевдослучайных значений по требованию, установив семя самостоятельно.

Так что, если у вас нет веских причин самостоятельно засеять двигатель, вы должны оставить его до двигателя.