在一个简单的移动脚本中,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
在第二种情况下保持为零?
最佳答案
这是人们在使用 Unity 时常犯的错误之一。 您必须很好地理解 C# 才能知道真正发生了什么以及为什么。
原因如下:
1。Rigidbody.velocity
和 Rigidbody2D.velocity
都是 Vector3
和 Vector2 的类型
。
2。Vector3
和 Vector2
都是structs
而不是 class
。
参见 struct
与 class
here了解更多信息。
3.Rigidbody.velocity
和 Rigidbody2D.velocity
是属性并使用 getter。这意味着它返回 Rigidbody2D.velocity
的副本,而不是原始变量或它的引用,因为它们都是如上所述的结构。
参见 reference type and value type有关这方面的更多信息。
4。当您调用 Vector3.Set
和 Vector2.Set
函数时,您是在 的副本上调用它>Vector3
和 Vector2
不是实际的或原始的 Vector,这是由于#3。
如果您真的想在 Rigidbody
上使用 Set
函数,请创建一个不同的 Vector 变量,您将使用它来调用该 Set
函数然后将值分配给您的 Rigidbody.velocity
。
例如,
Rigidbody2D body = null;
float dir = 4f;
Vector2 pos = Vector2.zero;
void YourFunction()
{
pos.Set(10 * dir, body.velocity.y);
body.velocity = pos;
}
关于c# - Vector3.Set 和 Rigidbody2D.velocity.Set 和功能无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48250768/