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

标签 c# unity3d properties

在一个简单的移动脚本中,bodygameObject.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# 才能知道真正发生了什么以及为什么。

原因如下:

1Rigidbody.velocityRigidbody2D.velocity 都是 Vector3Vector2 的类型

2Vector3Vector2 都是structs 而不是 class

参见 structclass here了解更多信息。

3.Rigidbody.velocityRigidbody2D.velocity 是属性并使用 getter。这意味着它返回 Rigidbody2D.velocity副本,而不是原始变量或它的引用,因为它们都是如上所述的结构。

参见 reference type and value type有关这方面的更多信息。

4。当您调用 Vector3.SetVector2.Set 函数时,您是在 的副本上调用它>Vector3Vector2 不是实际的或原始的 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/

相关文章:

c# - 如何在不使用类别的情况下在属性网格中添加组?

python - 在 Python 中,为什么属性优先于实例属性?

objective-c - Obj-C,一切的属性

c# - Azure 服务总线触发功能 - 绑定(bind)到 MessageReceiver

c# - Amazon S3 错误 - 无法为 SSL/TLS 安全通道建立信任关系

c# - 在不同情况下从更新中仅调用一次函数

ios - 如何将使用 Unity 制作的通用 iOS 应用程序的下载大小减少到 100MB 以下?

c# - 使用 C# 创建和写入数据到 CSV 文件的问题

c# - 从另一个列表更新列表 - Entity Framework

c# - Unity - 使用新输入系统/角色 Controller 让角色看着鼠标