news 2026/5/2 1:16:24

Unity 刚体的 默认力、瞬时力 区别

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Unity 刚体的 默认力、瞬时力 区别

想象你在推一辆超市购物车:

ForceMode.Force(默认力)= 你持续地推

  • 你的动作:你把手按在车上,一直不停地推

  • 效果:车会慢慢加速,你推得越久,车跑得越快。

  • 关键:这个力是持续的,只要你手不离开,力就一直在。

  • 在代码里:你需要在每一帧(或者更准确地说,在FixedUpdate里)都调用AddForce。如果你只调用一次,物理引擎会理解为:“哦,你只在这一瞬间推了一下,然后就松手了。”

ForceMode.Impulse(瞬时力)= 你猛地踢一脚

  • 你的动作:你猛地踢了车一脚,脚立刻离开。

  • 效果:车会瞬间获得一个速度,然后自己滑出去。踢的力气越大,初始速度越快。

  • 关键:这个力是瞬间的一次性爆发。脚离开后,力就没了,车靠惯性运动。

  • 在代码里:你只需要在踢的那一帧调用一次AddForce,物理引擎就知道:“这一下是爆发,后面没有了。”


使用AddForce方法,传入同样的力值,使用Force 、Impulse 有本质区别:

一个直观的实验:

假设质量 = 1,Time.fixedDeltaTime = 0.02(默认值):

// 两行代码,数值都是 10 rb.AddForce(10f, ForceMode.Force); // 持续力 rb.AddForce(10f, ForceMode.Impulse); // 瞬时力

结果完全不同:

模式实际效果产生的速度
Force一帧内(0.02秒)施加 10N 的力10 × 0.02 ÷ 1 =0.2 米/秒
Impulse一瞬间施加 10 N·s 的冲量10 ÷ 1 =10 米/秒

同样的数值 10,Impulse 产生的速度是 Force 的 50 倍!

为什么会有这种差异?

因为它们的物理含义不同:

ForceMode.ForceForceMode.Impulse
单位牛顿 (N)牛顿·秒 (N·s)
含义"每秒钟施加多少力""一次性给多少冲量"
计算公式速度变化 = 力 × 时间 ÷ 质量速度变化 = 冲量 ÷ 质量

关键点:Force多乘了一个Time.fixedDeltaTime(约 0.02 秒),所以效果被严重缩小了。



提问1: 我在按键时,实时地调用 rb.AddForce(...,ForceMode.Force),对象为什么会不停加速?

用推车的例子来理解

想象你每秒钟推车 60 次(60帧):

  • 第1次推:车从静止开始慢慢动

  • 第2次推:车还没停下来,你又补了一推

  • 第3、4、5次...:你不停地推,车就会越来越快

物理上完全正确:你一直给力,物体就一直加速。

为什么现实中车不会无限加速?

现实中有阻力

  • 空气阻力

  • 轮胎与地面的摩擦力

这些阻力会抵消你的推力。当推力 = 阻力时,速度就不再增加了(达到终端速度)。

印次你需要在刚体组件里设置Drag(阻力)(默认为0)

  • Drag = 0:无限加速(太空)

  • Drag = 1~5:会达到一个最大速度(汽车、飞机)

补充: 只要阻力(Drag)大于 0,遇到持续施加一个恒定的力,最终速度会稳定在一个固定值,不再增加。


提问2: 是不是可以只使用ForceMode.Force 传入一个很大的力,来替代ForceMode.Impulse呢?

不可以,它们各自有不可替代的用途。

想象这个场景

你想实现一个跳跳床

  • 角色踩上去的那一瞬间,被猛地弹起来

  • 弹起的速度很快,但只发生在接触的那一帧

如果用 ForceMode.Force 会怎样?

// 错误:用 Force 模拟跳跃 void OnCollisionEnter(Collision collision) { rb.AddForce(Vector3.up * 1000f, ForceMode.Force); }

问题:

问题说明
依赖时间

效果取决于Time.fixedDeltaTime(物理帧间隔)。如果物理帧率变了,跳跃高度也会变。

(当别人修改了fixedDeltaTime时,你的力计算就会出错。)

难以调参你需要手动计算:目标冲量 ÷ Time.fixedDeltaTime = 应该填的数值。比如要 10 的冲量,Time.fixedDeltaTime=0.02,就要填 500
语义混乱阅读代码的人会困惑:“这里是想持续推一秒钟?还是只是跳一下?”

正确代码:使用 ForceMode.Impulse :

// 正确:用 Impulse 模拟跳跃 void OnCollisionEnter(Collision collision) { rb.AddForce(Vector3.up * 10f, ForceMode.Impulse); }

优点:

  • 与时间无关:无论物理帧率如何,跳跃高度始终一致

  • 直观调参:填 10 就是“一次性给 10 的冲量”,不需要任何换算

  • 语义清晰:看到Impulse就知道“这是一次性爆发”

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/2 1:08:24

Taotoken 用量看板如何帮助项目精准控制 API 成本

Taotoken 用量看板如何帮助项目精准控制 API 成本 1. 用量看板的核心功能 Taotoken 控制台的用量看板为开发者提供了多维度的 API 调用数据可视化能力。通过聚合不同时间粒度(小时、天、周)的 token 消耗统计,项目负责人可以快速掌握整体支…

作者头像 李华
网站建设 2026/5/2 1:05:46

终极窗口隐私保护神器:Boss-Key老板键一键隐藏你的秘密窗口

终极窗口隐私保护神器:Boss-Key老板键一键隐藏你的秘密窗口 【免费下载链接】Boss-Key 老板来了?快用Boss-Key老板键一键隐藏静音当前窗口!上班摸鱼必备神器 项目地址: https://gitcode.com/gh_mirrors/bo/Boss-Key 在当今多任务办公环…

作者头像 李华
网站建设 2026/5/2 1:04:24

Femtofox Pro v1开发板:Linux与LoRa的嵌入式融合方案

1. Femtofox Pro v1开发板深度解析:当Linux遇上LoRa与Meshtastic最近在折腾一个特别有意思的小玩意儿——Femtofox Pro v1开发板。这可能是目前市面上最独特的LoRa开发平台之一,因为它竟然能在Rockchip RV1103芯片上跑完整的Linux系统!作为一…

作者头像 李华
网站建设 2026/5/2 0:57:34

Python(列表进阶)

目录 1.切片---不只是一段子列表 1.切片的内存模型:浅拷贝与共享 2. 切片的实现细节:slice 对象与 __getitem__ 3. 步长为负的彻底理解 4. 切片赋值的高级技巧 5. 切片作为视图:memoryview 与 array 模块 为什么切片会创建副本&#x…

作者头像 李华