Unity中Rigidbody2D.velocity.Set调用后无移动的原因咨询
body.velocity.Set()修改后物体不移动? 这个问题其实是Unity里值类型(struct)的特性导致的,很多刚接触Unity的开发者都会踩这个坑!
核心原因:Vector2是值类型,访问body.velocity返回的是副本
Vector2属于值类型(struct),而非引用类型(class)。当你访问body.velocity时,Unity并不会直接返回对刚体内部速度值的引用,而是返回一个当前速度的拷贝副本。
我们来拆解两种写法的本质区别:
有效写法:
body.velocity = new Vector2(10 * dir, body.velocity.y)
这行代码直接创建了一个全新的Vector2实例,然后将它赋值给body.velocity属性。此时Unity会把这个新的速度值同步到刚体上,所以物体能正常响应移动。无效写法:
body.velocity.Set(10 * dir, body.velocity.y)
这行代码的执行逻辑是:先获取body.velocity的临时副本,然后调用这个副本的Set方法修改它的x值。但问题在于,这个修改后的副本并没有被重新赋值回body.velocity——相当于你在草稿纸上改了数字,却没把草稿纸交给Unity处理,刚体的实际速度完全没变化,自然物体不动,也不会报错(代码本身没有语法错误,只是逻辑没触达实际的刚体速度)。
正确使用Set方法的方式
如果非要用Set来修改速度,需要先把速度值存到临时变量里,修改后再赋值回去:
// 先获取当前速度的副本 Vector2 currentVelocity = body.velocity; // 修改副本的x分量 currentVelocity.Set(10 * dir, currentVelocity.y); // 把修改后的副本同步回刚体 body.velocity = currentVelocity;
总结
值类型的变量在传递或访问时是拷贝而非引用,直接对body.velocity调用Set只是修改了一个临时拷贝,不会影响刚体的实际速度。必须把修改后的拷贝重新赋值给body.velocity,才能让刚体感知到速度变化。
内容的提问来源于stack exchange,提问作者Jan Turoň

