我编写了一个小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;
}
}
答案 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个输出)来设置种子。