Jan*_*roň 3 c# properties unity-game-engine
在bodyis的简单移动脚本中gameObject.GetComponent<Rigidbody2D> (),此代码应用移动
body.velocity = new Vector2 (10 * dir, body.velocity.y);
Run Code Online (Sandbox Code Playgroud)
然而,在这一个没有运动(也没有错误)出现
body.velocity.Set (10 * dir, body.velocity.y);
Run Code Online (Sandbox Code Playgroud)
我在Unity 文档中没有看到任何解释。你能解释为什么body.velocity.x在第二种情况下仍然为零吗?
这是人们在使用 Unity 时犯的错误之一。你必须很好地理解 C# 才能知道真正发生了什么以及为什么。
原因如下:
1 . Rigidbody.velocity并Rigidbody2D.velocity有两种类型的Vector3和Vector2。
2 . Vector3并且Vector2 都structs没有class。
见structVSclass 这里获取更多信息。
3 . Rigidbody.velocityandRigidbody2D.velocity是属性并使用getter。这意味着它返回的不是原始变量的副本Rigidbody2D.velocity或其引用,因为它们都是上面提到的结构。
有关更多信息,请参阅引用类型和值类型。
4 .当您调用Vector3.Set和Vector2.Set函数时,您是在 a 的副本上调用它,Vector3而Vector2不是实际或原始 Vector ,这是由于#3。
如果您真的想Set在Rigidbody创建一个不同的 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;
}
Run Code Online (Sandbox Code Playgroud)