Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Vector3.Set和Rigidbody2D.velocity.Set和function工作不正常_C#_Unity3d_Properties - Fatal编程技术网

C# Vector3.Set和Rigidbody2D.velocity.Set和function工作不正常

C# Vector3.Set和Rigidbody2D.velocity.Set和function工作不正常,c#,unity3d,properties,C#,Unity3d,Properties,在一个简单的移动脚本中,body是gameObject.GetComponent(),移动由该代码应用 body.velocity = new Vector2 (10 * dir, body.velocity.y); 然而,在这一个没有运动(或错误)出现 我看不出有什么解释。你能解释为什么在第二种情况下body.velocity.x保持为零吗?这是人们在使用Unity时犯的错误之一。 你必须很好地理解C#,才能知道到底发生了什么以及为什么 原因如下: 1刚体.velocity和刚体.veloc

在一个简单的移动脚本中,
body
gameObject.GetComponent()
,移动由该代码应用

body.velocity = new Vector2 (10 * dir, body.velocity.y);
然而,在这一个没有运动(或错误)出现


我看不出有什么解释。你能解释为什么在第二种情况下body.velocity.x保持为零吗?

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

原因如下:

1
刚体.velocity
刚体.velocity
都是
矢量3
矢量2
的类型

2
Vector3
Vector2
都是
结构
而不是

有关更多信息,请参见结构
vs
class

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

有关此操作的更多信息,请参阅

4调用
Vector3.Set
Vector2.Set
函数时,调用的是
Vector3
Vector2
的副本,而不是实际或原始向量,这是由于#3造成的

如果您确实想在
刚体上使用
Set
函数
创建一个不同的向量变量,您将使用该函数调用
Set
函数,然后将该值分配给
刚体.velocity

比如说,

Rigidbody2D body = null;
float dir = 4f;

Vector2 pos = Vector2.zero;

void YourFunction()
{
    pos.Set(10 * dir, body.velocity.y);
    body.velocity = pos;
}

嗯。我可以设计一个包含10个成员的结构属性,其中大多数成员将通过设计独立设置。然后我把它汇总到我的项目中的每一个类中,并将开发传递给我讨厌的人。哈哈,我不认为团结意味着让人们为此而受苦。出于性能原因,他们使用了
struct
,因为他们希望您能够在函数中
newvector2
,而无需分配内存。如果他们为此使用
,如果您在函数(尤其是
更新
)中使用
新矢量2
,您的游戏将变得更慢。尽管如此,我认为当从引用对象调用此函数时,他们应该警告人们,否则新的Unity用户将在类似这样的问题上陷入困境好几天。我不认为他们应该对此发出警告,这是C的一个非常基本的概念,应该作为语言的首要内容之一来学习。@Galandil True。这是一个C#东西,但Unity有时因违反标准而闻名。我认为,当从类调用时,他们应该使用
Set
函数对当前
向量执行操作。他们为使用
类的
ParticleSystem
做了这项工作。他们这样做是为了让一些粒子结构可以用来修改类/引用。例如,参见post。这在团结中并不少见。
Rigidbody2D body = null;
float dir = 4f;

Vector2 pos = Vector2.zero;

void YourFunction()
{
    pos.Set(10 * dir, body.velocity.y);
    body.velocity = pos;
}