在body
为gameObject.GetComponent<Rigidbody2D> ()
的简单移动脚本中,此代码会应用移动
body.velocity = new Vector2 (10 * dir, body.velocity.y);
然而,在这一个中没有出现移动(也没有错误)
body.velocity.Set (10 * dir, body.velocity.y);
我在Unity documentation中看不到任何解释。你能解释为什么body.velocity.x
在第二种情况下仍为零吗?
答案 0 :(得分:3)
这是人们在使用Unity时犯的错误之一。 你必须了解C#才能知道真正发生了什么以及为什么。
原因如下:
1 。Rigidbody.velocity
和Rigidbody2D.velocity
都是Vector3
和Vector2
的类型。
2 。Vector3
和Vector2
都是structs
而非class
。
有关详细信息,请参阅struct
vs class
here。
3 。Rigidbody.velocity
和Rigidbody2D.velocity
是属性,并使用 getter 。这意味着它返回副本 Rigidbody2D.velocity
而不是原始变量或它的引用,因为它们都是上面提到的结构。
有关详细信息,请参阅reference type and value type。
4 。当您拨打Vector3.Set
和Vector2.Set
功能时,您正在Vector3
和Vector2
的副本上拨打该功能实际或原始的Vector,这是由于#3 。
如果你真的想在Set
上使用Rigidbody
函数创建一个不同的Vector变量,你将用它来调用Set
函数,然后将值赋给你的{{ 1}}。
例如,
Rigidbody.velocity