Unity Random Range不能按预期工作

时间:2017-02-17 21:38:47

标签: unity3d random

我编写了一个小pong克隆。 一开始,球在球场中间产生。

预期输出 我希望球能以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;
}

}

2 个答案:

答案 0 :(得分:2)

Random.InitState用于为随机引擎设定种子。来自Random类的随机数不是随机的,它们是pseudo-random.伪随机数是确定性的;如果您使用相同的种子调用Random.InitState,然后使用相同的参数调用Random.Range,您将始终获得相同的值。由于您将GetRandom调用两次以至于彼此接近,因此您可能会将引擎重新设置为相同的值(或接近它),这样您就可以获得一个与之相同的随机数。最后一个。你应该只为引擎播种一次。 This is covered in the Unity documentation.事实上,根据文件:

  

种子通常在使用随机数函数之前从某个任意值设置,如系统时钟。这可以防止每次玩游戏时发生相同的值运行,从而避免可预测的游戏玩法。但是,通过自己设置种子,按需生成相同的伪随机值有时很有用。

因此,除非你有充分的理由自己播种引擎,否则你应该把它留给引擎。

答案 1 :(得分:0)

删除行Random.InitState((int) System.DateTime.Now.Ticks) InitState用于设置种子,通常只用一次以获得相同的结果。似乎通过每次设置种子返回相同的值(或相同的2个输出)来设置种子。