Vector3.Set 和 Rigidbody2D.velocity.Set 和功能无法正常工作

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在第二种情况下仍然为零吗?

Pro*_*mer 5

这是人们在使用 Unity 时犯的错误之一。你必须很好地理解 C# 才能知道真正发生了什么以及为什么。

原因如下:

1 . Rigidbody.velocityRigidbody2D.velocity有两种类型的Vector3Vector2

2 . Vector3并且Vector2structs没有class

structVSclass 这里获取更多信息。

3 . Rigidbody.velocityandRigidbody2D.velocity是属性并使用getter。这意味着它返回的不是原始变量的副本Rigidbody2D.velocity或其引用,因为它们都是上面提到的结构。

有关更多信息,请参阅引用类型和值类型

4 .当您调用Vector3.SetVector2.Set函数时,您是在 a 的副本上调用它,Vector3Vector2不是实际或原始 Vector ,这是由于#3

如果您真的想SetRigidbody创建一个不同的 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)