【Unity300个技巧】牛顿的学问!如何优雅地使用力?

news2025/8/2 9:50:16

Unity 提供了一个完备且强大物理引擎。但在刚接触的时候,你可能会对它与现实物理规律对应有一些疑惑。
比如:

  • 现实中 1N 的力在 Unity 中怎么表现?
  • Unity 中物体的质量是计算的?
  • Unity 中给物体添加力的方法是 rb.AddForce(),但却又提供了4种力的模式,为什么呢?

本文章,我们就来探讨一下以上的问题。

额外资源

  • 项目地址:GitGub
  • 视频:B站视频

Unity 中力的单位

在 Unity 中,rb.AddForce()是给物体添加一个力的方法,传参是向量对象,向量的 x ,y,z 代表这方向,值代表力的大小。
image.png
这里可能会让人疑惑,这里力的单位是什么呢?是否对应现在中的力的单位 N ?
要验证这个点,最好的办法就算找一个物理学中常量,看这个常量在 Unity 中是多少。
毫无疑问,重力就是我们心中的那个常量。
在现实中,重力约等于 9.81N。
在Unity 中,我们可以在设置里看到重力的默认值,在Y轴方向的大小也是9.81。
image.png
所以,我们可以认为,传参向量值的单位等于现实中的 N。
我们可以验证一下。
在一个只有重力的场景,我们添加一个9.81的相对于重力反方向的力,物体时静止的。
image.png
代码实现

public class TestGravity : MonoBehaviour
{

    private Rigidbody2D _rigidbody2D;
    [Header("向上的力")]
    [SerializeField]
    private float _force;
    
    void Start()
    {
        _rigidbody2D = transform.GetComponent<Rigidbody2D>();
    }

    private void FixedUpdate()
    {
        _rigidbody2D.AddForce(new Vector3(0, _force, 0));
    }
}

运行一下。
一开始,赋予一个9.81N向上的力时,人物时静止的。当逐渐增加力后,人物向上移动了。
在这里插入图片描述

Unity 中物体的质量

在物理学中,涉及到力的计算肯定离不开物体的质量。
在 Unity 中,我们可以认为单位是kg,因为这有助于我们计算。其实这个单位并不太重要,它在 Unity 引擎中的作用只是用于描述两个物体之间相对差异,比如两个物体质量分别是 10 和 100,可以确定的是 100 质量的物体是 10 质量物体的 10 倍重。
images.png
举个例子。
从上面公式中得知,同一个力的大小作用在不同物体上,因为质量不同,物体移动的加速度就会不一样。
质量不同.gif
因此,在游戏里,我们不需要知道质量的单位是多少,只需要维护好每个对象的质量相对值就可以了。
当游戏体量上来后,去维护他们的质量数值也比较麻烦。所以在 2D 模式下,Unity 提供了一个功能,自动计算质量。
image.png
当选择启用自动质量后,Unity 会根据 物体的密度和面积自己计算质量。
image.png

自动计算质量.gif

举个例子。
我们使用相同的力和相同的密度,只改变物体的面积。
效果如下:
自动质量,.gif

力的模式

从上文我们了解到改变力的大小和质量,从而控制物体的速度。
但是公式 F=ma中,a 只是加速度,不够直观反馈物体的速度。
我们变换一下公式,
F= ma = m v/t, Ft = m v (t 为时间,v 为速度)

这样我们就可以很直观的得到速度 v 的大小,但也引入多了一个数值-时间。

时间 t 在 Unity 中应该怎么表示呢?
我们知道,为了保证物理模拟正常运行都会把逻辑写在 FixedUpdate 方法里。因此时间 t 就等于固定频率,默认为0.02s。
这样力,质量,时间都知道怎么表示了,我们可以快速算出物体的速度。

但且慢,为了改变物体的速度,我需要控制3个变量,那也太麻烦了把。
Unity 为此提供4种模式,目的就是为了减少开发者需要关心这么多的变量。

image.png
看起来很棒,但却又多了一对概念-连续力和瞬时力。无语~
什么是连续力,什么是瞬时力呢?
在我看来,他们之间没有区别。因为给物体添加力,都是在当前帧里完成的,与下一帧无关,根本不存在连续添加力的情况。
那这里的连续力是什么意思呢?
其实是将力的大小乘以每一固定帧的时间间隔 ,F * 0.02s = 当前帧的力大小。
相比于瞬时力,瞬时力是没有乘以时间的 ,相当于 F * 1 = 当前帧的力大小。

为了更好说明问题,我们演示一下。
代码如下:
Force 模式下的代码

public class AddForce_Default : MonoBehaviour
{
    // 赋予2的力
    public float force = 2;
    private Rigidbody2D _rigidbody2D;
    // 移动方向
    private Vector3 dir = Vector3.right;
    
    void Start()
    {
        _rigidbody2D = GetComponent<Rigidbody2D>();
    }

    private void FixedUpdate()
    {
        _rigidbody2D.AddForce(Vector2.right * force,ForceMode2D.Force);
    }
}

Impulse 模式下的代码

public class AddForce_Impulse : MonoBehaviour
{
    // 赋予2的力
    public float force = 2;
    private Rigidbody2D _rigidbody2D;
    // 移动方向
    private Vector3 dir = Vector3.right;
    
    void Start()
    {
        _rigidbody2D = GetComponent<Rigidbody2D>();
       
    }

    private void FixedUpdate()
    {
        _rigidbody2D.AddForce(Vector2.right * force,ForceMode2D.Impulse);
    }
}

运行效果:
两种模式下,速度不同.gif
可以看到在 Force 模式下,角色移动明显慢得多。
那是因为每一固定帧下,Force 模式下只赋予角色 2*0.02 的力,而 Impulse 模式下,赋予角色 2 的力。

为了验证这一点,我们可以将 Impulse 模式下的力改为0.04。
运行效果:
两种模式下,速度相同.gif

Acceleration 模式和 VelocityChange 模式
在 3D 模式下 ,还会额外多两个模式。在这两个力模式下,都会忽略物体的质量,默认为1。
所以我们只控制力的大小,就可以控制速度大小了。
在这里插入图片描述

求点赞,求关注。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/16119.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ICME 论文Latex模版要求

2023年模版获取链接&#xff1a; 链接: https://pan.baidu.com/s/1Hjk4nnybQN6LE23SGfbxKQ 提取码: 27dj --来自百度网盘超级会员v4的分享 论文写作要求&#xff1a; 所有手稿必须是英文的&#xff1b; 论文长度不应超过6页&#xff0c;包括所有文本、图形和参考文献&#…

Qt 设置CPU亲缘性,把进程和线程绑定到CPU核心上(Linux)

Qt 设置CPU亲缘性&#xff0c;把进程和线程绑定到CPU核心上(Linux) 文章目录Qt 设置CPU亲缘性&#xff0c;把进程和线程绑定到CPU核心上(Linux)摘要1 什么是CPU亲缘性2 目的3 API 介绍3.1 进程绑定到CPU3.2 线程绑定到CPU4 实际操作4.1 实操代码主进程串口线程USB线程程序运行资…

iOS开发M1芯片遇到的问题

pod失败执行&#xff1a; sudo arch -x86_64 gem install ffi Then arch -x86_64 pod install M1芯片的Mac无法在模拟器上运行项目building for iOS Simulator或could not find module for target.. 真机上可运行&#xff0c;模拟器上不行&#xff0c;并出现以下错误&#xf…

高级UI之贝塞尔曲线

前言 相信很多同学都知道“贝塞尔曲线”这个词&#xff0c;我们在很多地方都能经常看到。但是&#xff0c;可能并不是每位同学都清楚地知道&#xff0c;到底什么是“贝塞尔曲线”&#xff0c;又是什么特点让它有这么高的知名度。 贝塞尔曲线的数学基础是早在 1912 年就广为人…

八款流行无线黑客工具,非常实用

1、Aircrack Aircrack是最受欢迎的无线密码破解工具之一&#xff0c;可用于802.11a / b / g WEP和WPA破解。Aircrack使用的算法是通过捕获数据包来恢复无线密码。收集到足够的数据包后&#xff0c;它会尝试恢复密码。为了使攻击更快&#xff0c;它通过一些优化实现标准的FMS攻…

腾格尔和黑鸭子,演唱《遥远的地方》不同版本,哪首歌更值得期待

说起中国华语乐坛的音乐人&#xff0c;腾格尔老师算比较出名的一位&#xff0c;听说最近他又推出了一首新歌。《遥远的地方》这首歌曲&#xff0c;就是腾格尔老师的新歌&#xff0c;可能很多人会对这个歌名感到有些熟悉。 早在九十年代的时候&#xff0c;中国华语乐坛非常流行组…

【雷神笔记本快捷键】雷神笔记本FN功能快捷键大全以及电脑CPU处于低功耗但电脑风扇高速转动噪音较大解决方案

雷神笔记本FN功能快捷键大全以及电脑CPU处于低功耗但电脑风扇高速转动噪音较大解决方案。 本计算机有16个功能键盘。这些键的功能因应用程序而异。 请参阅软件文档以了解各个键的使用方法。 【FN】键提供便携式电脑的扩展功能,始终与另一按键搭配使用。‘【FNEsc】:启用或禁用…

教你如何使用 Visual Studio IDE 正确的进行 C++ 桌面开发

目录 先决条件 入门 一、演练&#xff1a;使用项目和解决方案 (C) 准备工作 创建项目 在 Visual Studio 中创建项目 组织项目和文件 向项目添加类 向主函数添加测试代码 向项目添加测试代码 生成并运行应用项目 生成并运行此项目 二、演练&#xff1a;生成项目 (C…

改良海量数据存储的若干的手段-转变数据垃圾为黄金

教材篇 直到翻看了后面章节&#xff0c;才注意到封面上面的标语&#xff0c;中文意思是“禁止倾倒数据垃圾&#xff0c;违者务必读此书&#xff01;” 大致祖师爷对杂乱无序的数据垃圾深恶痛绝&#xff0c;在这点上大凡上了点年头的数据工作者都是深有体会~ 直到翻看了后面章…

三相和单相智能微型断路器功能有区别吗?

安科瑞 华楠 ASCB1系列智能微型断路器是安科瑞电气股份有限公司全新推出的智慧用电产品&#xff0c;产品由智能微型断路器与智能网关两部分组成&#xff0c;可用于对用电线路的关键电气因素&#xff0c;如电压、电流、功率、温度、漏电、能耗等进行实时监测&#xff0c;具有远程…

渗透测试与漏洞扫描的区别

企业通常将漏洞扫描视为渗透测试的替代方法。这种认识是错误的。具有网络安全意识的组织必须在其业务流程中包括这两项活动&#xff0c;并确保它们协同工作。错过其中之一会大大降低 Web 应用程序安全性和网络安全性的安全状况。渗透测试和漏洞扫描也被单独视为合规性要求&…

【TFS-CLUB社区 第6期赠书活动】〖uni-app跨平台开发与应用从入门到实践〗等你来拿,参与评论,即可有机获得

文章目录❤️‍&#x1f525; 赠书活动 - 《uni-app跨平台开发与应用从入门到实践》❤️‍&#x1f525; 编辑推荐❤️‍&#x1f525; 抽奖方式与截止时间❤️‍&#x1f525; 赠书活动 → 获奖名单❤️‍&#x1f525; 赠书活动 - 《uni-app跨平台开发与应用从入门到实践》 内…

Redis事务操作

Redis事务操作 每个公司每个项目可能有不同的引入方式&#xff0c;但是最基本的都大差不差&#xff0c;所以这里只展示最基本的。 redis事务定义 redis事务是一个单独的隔离操作&#xff0c;事务中的所有命令都会序列化、按顺序地执行&#xff0c;事务在执行的过程中&#x…

Rancher - v2.6.5升级v2.7.0

Rancher&#x1f449;v2.6.5升级v2.7.0 时间&#xff1a;2022年11月18日16:37:50 2022-11-17凌晨&#xff0c;rancher推出了新的稳定版&#xff1a;v2.7.0。 一、为什么要升级到v2.7.0&#xff1f;v2.6.5有什么严重的问题吗&#xff1f; ● 对于私有云来说&#xff0c;一般生…

C51项目 - 可调万年历

目录一、实验目的二、实验仪器三、实验效果预览1.显示效果2.调节效果四、实验原理五、单片机代码1.头文件包含2.类型定义3.时钟模块4. 液晶显示模块5.温度传感器模块6. 红外通讯模块7.开机初始化8.特殊功能函数9.代码段常量10.完整代码一、实验目的 使用51单片机作为主控芯片&…

Hybrid app混合开发的一些经验和总结

随着5G技术的发展和移动终端普及&#xff0c;移动设备的便捷性和网络的泛在化&#xff0c;移动应用已广泛应用于电子商务、电子政务、医疗和辅助教学中。 智能手机等移动终端的存储、运算能力不断增强&#xff0c;但其显示、输入等不如PC灵活&#xff0c;对操作界面灵活性有强…

Redis 搭建高可用集群

、单个redis服务搭建请参考&#xff1a;redis服务搭建 2、在/usr/local下创建目录redis-cluster,并在redis-cluster下创建 6379、6380、6381目录以及data、temp目录 # cd /usr/local # mkdir redis-cluster --其他文件创建类似&#xff0c;此处不一一写出 3、复制安装后的re…

[笔记]快乐的Linux命令行《二》文件系统中跳转

系列文章目录 [笔记]快乐的Linux命令行《一》LInux系统简介以及什么是shell [笔记]快乐的Linux命令行《二》文件系统中跳转 文章目录系列文章目录前言一、文件系统中跳转1.1 理解文件系统树Linux基本文件系统树目录介绍与Windows的异同1.2 当前工作目录pwd 显示当前工作目录1.…

CSS基础入门

CSS基础入门 1.官方文档 1.CSS 指的是层叠样式表* (Cascading Style Sheets) 2.地址: https://www.w3school.com.cn/css/index.asp 2.为什么需要 CSS 1.在没有 CSS 之前&#xff0c;我们想要修改 HTML 元素的样式需要为每个 HTML 元素单独定义样式属性&#xff0c;费心费力…

手把手教你如何编写一个Makefile文件

一、概念理解&#xff08;彩蛋藏在某个地方&#xff09; 1.1 什么是Makefile&#xff1f; C语言中&#xff0c;我们使用visual studio开发软件时候&#xff0c;写程序开始时候都会创建一个project项目文件&#xff0c;然后在文件里面编译 .h 和 .c 的文件。在Linux中&#xf…