You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity中Rigidbody2D.velocity.Set调用后无移动的原因咨询

为什么body.velocity.Set()修改后物体不移动?

这个问题其实是Unity里值类型(struct)的特性导致的,很多刚接触Unity的开发者都会踩这个坑!

核心原因:Vector2是值类型,访问body.velocity返回的是副本

Vector2属于值类型(struct),而非引用类型(class)。当你访问body.velocity时,Unity并不会直接返回对刚体内部速度值的引用,而是返回一个当前速度的拷贝副本。

我们来拆解两种写法的本质区别:

  1. 有效写法:body.velocity = new Vector2(10 * dir, body.velocity.y)
    这行代码直接创建了一个全新的Vector2实例,然后将它赋值给body.velocity属性。此时Unity会把这个新的速度值同步到刚体上,所以物体能正常响应移动。

  2. 无效写法: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ň

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:25:46