【Unity】[帮助文档] AddForce函数详解,参数ForceMode(Acceleration、Force、Impulse 和 VelocityChange)的选择

2023-11-14

背景

经常忘,经常查,倒不如我自己写一篇给自己方便参考,毕竟每次都在某N站查出来的都是不知道互抄到哪一年的机翻文章。

本文涉及代码与测试参考unity版本为2021.3,
在这里插入图片描述

AddForce

用于对rigidbody组件对象添加力的作用。
其参数决定了添加力的作用方式,因此参数不同,其获得的效果(动量、动能)也不同。
另外unity重力加速度默认为9.81左右,随着物体的状况会有改变。使用Debug.Log("Gravity: " + Physics.gravity);查看重力加速度(重力加速度也有方向!所以也是Vector3)。

要点

你需要了解并理解以下内容

  • 力是矢量,有方向,因此调用时的第一个参数是Vector3类型

  • 无论选什么参数施力,力都不会自动应用于后续帧。它只会在您调用AddForce函数的那一刻应用。区别仅在于它如何计算要施加多少力,而不在于它如何施加力。 https://answers.unity.com/questions/696068/difference-between-forcemodeforceaccelerationimpul.html

  • 使用 AddForce 时,不用手动使用 Time.deltaTime 或
    fixedDeltaTime,其内部的物理函数会自动将时间纳入计算。
    https://answers.unity.com/questions/1752181/does-addforce-with-forcemodeforce-use-timedeltatim.html

  • 物理相关的代码最好在fixUpdate函数而不是update内进行,因为fixupdate的时间间隔是固定的,update的时间间隔取决于帧率,且每次都不确定。

  • 持续的力(fixUpdate内的持续调用)使用Force、Acceleration参数,单次的力使用Impulse参数,对速度的改变使用VelocityChange参数

ForceMode

Force(力):

通过 AddForce 函数添加力,单位为 N。如果我们在FixUpdate内持续调用AddForce(Vector3.up *100,ForceMode.Force),那一秒内的50次调用(默认情况下FixUpdate 0.02秒调用一次)即为对该物体产生一个向上的100N的力持续一秒。
这两行代码是一样的

 rigidbody.AddForce(Vector3.forward*1.0f,ForceMode.Force);
 
 rigidbody.velocity += Vector3.forward*1.0f * Time.fixedDeltaTime / (rigidbody.mass);

Impulse(冲量):

通过 AddForce 函数添加冲量,单位为 N /s(牛顿每秒)。冲量是一个在一瞬间产生的力,AddForce(Vector3.up *100,ForceMode.Impulse)调用1次与AddForce(Vector3.up *100,ForceMode.Force) 调用50次(一秒)的总力一样。
这两行代码是一样的

 rigidbody.AddForce(Vector3.forward*1.0f,ForceMode.Impulse);
 
 rigidbody.velocity += Vector3.forward*1.0f / rigidbody.mass;

Acceleration(加速度):

通过 AddForce 函数添加加速度。忽略对象的质量,AddForce(Vector3.left*100,ForceMode.Acceleration)在fixupdate内执行一秒(默认50次),即视作一秒内物体保持了一个向左的100的加速度,静止的物体会在一秒后速度变为100.
这两行代码是一样的

 rigidbody.AddForce(Vector3.forward*1.0f,ForceMode.Acceleration);
 
 rigidbody.velocity += Vector3.forward*1.0f * Time.fixedDeltaTime;

VelocityChange(变速):

通过 AddForce 函数添加的速度变化,单位为 m/s。忽略对象的质量,速度变化是一个直接改变物体速度的量,它可以在一次调用后立即影响物体的运动状态。
这两行代码是一样的

rigidbody.AddForce(Vector3.forward*1.0f,ForceMode.VelocityChange);
 
rigidbody.velocity += Vector3.forward*1.0f;

参考:

https://answers.unity.com/questions/802181/trying-to-understand-rigidbody-forcemode-derivatio.html?childToView=802667#answer-802667

是否与质量有关

参数 质量有关
Force
Impulse
Acceleration
VelocityChange

为了深化理解,做点实验

VelocityChange

用一个左平抛运动的物体举例,物体在(0,0,0)生成。初速为0,有重力加速度,所以我们只用关注x轴向速度。

private void FixedUpdate()
    {
        rb.AddForce(Vector3.left * 10, ForceMode.VelocityChange);
        //当对象y坐标小于0,摧毁该对象,并输出当前坐标
        if (transform.position.y < 0)
        {
            Destroy(gameObject);
            Debug.LogWarning("Position: " + transform.position);
        }

        //输出物体当前速度
        Debug.Log("Velocity: " + rb.velocity);
    }

在这里插入图片描述
每次调用使得x轴向速度增加10。相当于

rigidbody.velocity += Vector3.left*10f;

Acceleration 和Force

用一个左平抛运动的物体举例,物体在(0,0,0)生成。初速为0,有重力加速度,所以我们只用关注x轴向速度。

    private void FixedUpdate()
    {
        rb.AddForce(Vector3.left * 10, ForceMode.Acceleration);
        //当对象y坐标小于0,摧毁该对象,并输出当前坐标
        if (transform.position.y < 0)
        {
            Destroy(gameObject);
            Debug.LogWarning("Position: " + transform.position);
        }

        //输出物体当前速度
        Debug.Log("Velocity: " + rb.velocity);
        
       
    }

在这里插入图片描述
一次调用使得x方向速度改变0.2(即一秒调用使x方向速度变为10,与代码中Vector3.left * 10一致)

Acceleration可以理解为 ,函数内部的执行效果相当于,参数为Force的力的大小自动乘以了对象的质量,即以下俩代码效果相同

rb.AddForce(Vector3.left * 10 * rb.mass, ForceMode.Acceleration);
rb.AddForce(Vector3.left * 10, ForceMode.Force);

即当物体质量为1的时候,参数为Acceleration或Force的函数调用,使得对象获得相同的效果。验证如下

  • Acceleration
    在这里插入图片描述
    private void FixedUpdate()
    {
        rb.AddForce(Vector3.left * 10 * rb.mass, ForceMode.Acceleration);
        //当对象y坐标小于0,摧毁该对象,并输出当前坐标
        if (transform.position.y < 0)
        {
            Destroy(gameObject);
            Debug.LogWarning("Position: " + transform.position);
        }

        //输出物体当前速度
        Debug.Log("Velocity: " + rb.velocity);
    }
  • Force

在这里插入图片描述

    private void FixedUpdate()
    {
        rb.AddForce(Vector3.left * 10, ForceMode.Force);
        //当对象y坐标小于0,摧毁该对象,并输出当前坐标
        if (transform.position.y < 0)
        {
            Destroy(gameObject);
            Debug.LogWarning("Position: " + transform.position);
        }

        //输出物体当前速度
        Debug.Log("Velocity: " + rb.velocity);
    }

参考:

我自己

后记

一篇文章查资料做实验写了一晚上,学到了很多,但是有用的都是英文的资料,中文的没怎么搜到,所以也想分享给同是学unity的在中文互联网上查资料的你,求点点赞,点点收藏,谢谢你了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【Unity】[帮助文档] AddForce函数详解,参数ForceMode(Acceleration、Force、Impulse 和 VelocityChange)的选择 的相关文章

随机推荐

  • {"error":{"root_cause":[{"type":"security_exception","reason":"missing authentication token for REST

    错误如下 error root cause type security exception reason missing authentication token for REST request idx header WWW Authen
  • cpustat:在 Linux 下根据运行的进程监控 CPU 使用率

    转自 https linux cn article 8466 1 html pr cpustat 是 Linux 下一个强大的系统性能测量程序 它用 Go 编程语言 1 编写 它通过使用 用于分析任意系统的性能的方法 USE 2 以有效的方
  • Redis学习笔记

    Redis学习笔记 什么是Redis 安装Rides 启动Redis 连接Redis Redis基础知识 五大数据类型 1 String 2 List 3 Set 4 Hash 5 Zset 三种特殊数据类型 1 geospatial 地理
  • 以太坊的MPT树,以及编码,leveldb存储

    声明 此为使用网上多处资料整理而成 由于很多地方内容相同 已经分不清哪里是原创 一 MPT树 1 Trie树 Trie 又称为字典树或者前缀树 prefix tree 属于查找树的一种 它与平衡二叉树的主要不同点包括 每个节点数据所携带的
  • IPP图像处理函数命名格式

    IPP图像处理函数命名格式 专栏目录 说明 一 函数格式 二 data domain 三 Name 1 无修饰符的名称 2 有修饰符的名称 四 数据类型 五 描述符 六 参数 七 拓展 八 函数原型 专栏目录 一 IPP简介及windows
  • Android 初级到高级 进阶

    高级Android学习 Android学习路线指南 singwhatiwanna的博客 CSDN博客
  • ads原理图生成layout_ADS原理图和版图协同优化仿真方法总结

    1 概述 在用ADS进行射频电路仿真时 在原理图层面仿真完毕后 通常还要考虑实际的射频版图布局中传输线的耦合 印制板介质损耗等效应的影响 此时就要在ADS的版图仿真中来实现 在学习ADS时 需要版图仿真时 通常是先原理建模 然后通过生成版图
  • SpringCloud 微服务服务治理注册中心

    一 什么是服务治理 在传统rpc远程调用中 服务与服务依赖关系 管理比较复杂 所以需要使用服务治理 在这里插入图片描述管理服务与服务之间依赖关系 可以实现服务调用 负载均衡 容错等 实现服务发现与注册 二 服务注册与发现 在服务注册与发现中
  • Unity脚本实现——触摸屏3D模型,随单根手指,无死角旋转(Input的GetTouch方法和touchCount属性)

    Unity脚本实现模型360度旋转 参考别人随手指绕Y轴转动 添加了绕X轴转动 using System Collections using System Collections Generic using UnityEngine publ
  • document 使用方法介绍

    document节点是文档的根节点 每张网页都有自己的document节点 属性 1 document doctype 它是一个对象 包含了当前文档类型 Document Type Declaration 简写DTD 信息 2 docume
  • Tessy — 嵌入式软件单元测试/ 集成测试工具

    Tessy 源自戴姆勒 奔驰公司的软件技术实验室 由德国Hitex 公司负责全球销售及技术支持服务 是一款针对嵌入式软件进行单元 集成测试的工具 它可以对C C 代码进行单元 集成测试 可以自动化搭建测试环境 执行测试 评估测试结果并生成测
  • SpringBoot 线程池的使用

    前言 最近在做订单模块 用户购买服务类产品之后 需要进行预约 预约成功之后分别给商家和用户发送提醒短信 考虑发短信耗时的情况所以我想用异步的方法去执行 于是就在网上看见了Spring的 Async了 但是遇到了许多问题 使得 Async无效
  • flutter Flex Wrap Stack Align布局

    1 flex布局 Flex direction Axis horizontal 水平反向 direction不能为空 direction Axis vertical 垂直反向 Expanded flex 1 实现代码如下 child Con
  • C语言-宏定义

    C语言 宏定义 1 宏定义是什么 2 宏定义怎么用 2 1 宏定义常量 2 1 1 预定义宏 2 1 2 自定义宏 2 2 带参数的宏 2 3 编译预处理 3 宏展开 4 编译预处理指令 1 宏定义是什么 宏是用来表示一段代码的标识符 宏也
  • how to unzip split file

    1 how to unzip split file cat zipfile tar gz tar zxv
  • springBoot整合log4j2

    文章目录 什么是log4j2 springBoot依赖的引入 接下来是log4j2的示例配置 首先在application yml制定采用哪个配置文件 在resources目录下新建log4j2 xml文件 什么是log4j2 Apache
  • Linux系统:stress-ng测压工具

    目录 一 理论 1 stress工具简介与安装 2 语法及参数 3 具体安装 二 实验 1 运行8 cpu 4 fork 5 hdd 4 io 50 vm 10小时 2 CPU测试 3 内存测试 4 IO测试 5 磁盘及I O测试 三 问题
  • Java同步代码块详解

    目录 一 什么是内置锁 二 什么是重入 三 活跃性与性能 四 对象的共享 1 可见性 2 非原子的64位操作 3 volatile变量 一 什么是内置锁 Java提供了一种内置的锁机制来支持原子性 同步代码块 同步代码块包含两部分 一个作为
  • SQL,如何更新表结构

    We can alter an existing table structure using the ALTER TABLE command followed by the alteration you want to make 我们可以使
  • 【Unity】[帮助文档] AddForce函数详解,参数ForceMode(Acceleration、Force、Impulse 和 VelocityChange)的选择

    背景 经常忘 经常查 倒不如我自己写一篇给自己方便参考 毕竟每次都在某N站查出来的都是不知道互抄到哪一年的机翻文章 本文涉及代码与测试参考unity版本为2021 3 AddForce 用于对rigidbody组件对象添加力的作用 其参数决