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
的类型
2Vector3
和Vector2
都是结构
而不是类
有关更多信息,请参见结构vsclass
3Rigidbody.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;
}