unity 关于使用Rigidbody的Addforce但不起作用的一些可能原因以及解决方法


文章前半部分会总结性的谈到测试过程中发现的可能原因及解决方法,需要注意的是文章以按下空格角色跳跃作为测试点,后办部分则是展示测试过程中查阅的官方API解释以及分析等。

V I K O _ C A K E

可能原因 + 解决方法

  1. 当你使用的输入方法为:Input.GetKeyDown(KeyCode.Space),可以尝试在Addforce函数后面加入参数:ForceMode.VelocityChange,如下:
void jump()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            rb.AddForce(Vector3.up * force,ForceMode.VelocityChange); 
        }
    }
  1. 以上述不同,当你使用的输入方法为:Input.GetButton(“Jump”)时则如下代码无需添加参数,需要注意的是Input.GetButtonDown(“Jump”)也是不可以的
if (Input.GetButton("Jump"))
        {
            rb.AddForce(Vector3.up * force); 
        }
  1. 如果将代码改写得和上述的有效代码一样却依然没有效果,可以尝试检查Rigidbody组件是否开启了动态刚体(使用AddForce不能开启该选项)

  1. 代码逻辑问题,当你检查了所有部分却依然没有效果时可以尝试从代码中是否存在其它逻辑开始测试。比如作者这里加入一个判断角色是否在地面的判断,就导致了逻辑问题的产生:
private void Update()
    {

        //跳跃监听
        if (Input.GetButton("Jump") && canJump )
        {
            ani.SetTrigger("isjump");
            rb.AddForce(transform.up * jumpForce);
            canJump = false; 
        }
    }
private void OnCollisionEnter(Collision collision)
    {
        if (collision.gameObject.CompareTag("Ground"))
        {
            canJump = true;
        }
    }

当您简单的阅读了上述代码就会发现Update中的Addforce方法只会执行一帧,看起来就是Addforce没有效果了,这显然是不符合咱们预期的,怎么修改呢,大家伙儿可以如下修改:

private void Update()
    {

        //跳跃监听
        if (Input.GetButton("Jump") && canJump )
        {
            ani.SetTrigger("isjump");
            rb.AddForce(transform.up * jumpForce);
            //canJump = false; 这句话不能在这里用
        }
        if (Input.GetButtonUp("Jump"))
        {
            canJump = false;
        }
    }
private void OnCollisionEnter(Collision collision)
    {
        if (collision.gameObject.CompareTag("Ground"))
        {
            canJump = true;
        }
    }

涉及到的API以及分析

  1. 对于第一种和第二种原因,作者在查阅相关资料GetButton 和 GetxxxDown的区别就在于二者返回true的时长,GetxxxDown仅会在按下的帧时间返回true,而GetButton则会在按下期间均返回true。

而为什么对AddForce使用参数后GetxxxDown也能起效果呢?首先按照逻辑,使用GetxxxDown时仅会执行很短的时间,所以参数的效果应该能在一瞬间起作用而不是随着执行逐步变化的。

遗憾的是官方文档并未解释该ForceMode的一些特性和不同。上图按翻译分别是:加速度,冲量,速度改变。经过测试冲量和速度改变均可以瞬间生效。

  1. 对于第三种情况,在官方的API中即有描述:

需要注意的是这里的活动状态并不是指物体需要运动,而是物体本身的Setactive属性。

  1. 对于作者最后提到的逻辑问题,代码的写法是非常多的,不能兼顾到所有可能的情况,作者这里分享一下个人测试过程的方法,首先就是多用Debug.Log方法,用来判断代码执行是否顺利,其次就是删除,删除部分逻辑,再测试功能是否正常,这个方法对于寻找问题而言应该还是蛮好用的。

如果对您起到了一些些帮助,可以点个赞吗宝~(●ˇ∀ˇ●)

  • 23
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 15
    评论
### 回答1: "AddForce"是Unity引擎中Rigidbody组件的一个函数,它可以在物体上施加一个力。其语法如下: ```csharp public void AddForce(Vector3 force, ForceMode mode = ForceMode.Force); ``` 其中,"force"参数是要施加的力,"mode"参数是力的类型,可选的类型有: - Force: 以普通的力的形式施加。 - Acceleration: 以物体的质量作为加速度计算施加。 - Impulse: 以瞬间的冲量形式施加。 - VelocityChange: 以物体的质量作为加速度计算施加。 例如,下面的代码在物体上施加一个向上的力: ```csharp public Rigidbody rb; void Start() { rb = GetComponent<Rigidbody>(); rb.AddForce(Vector3.up * 10f, ForceMode.Force); } ``` ### 回答2: Unity中的Rigidbody AddForce是一个常用的函数,用于给刚体对象施加力。在游戏开发中,我们经常需要给对象施加各种力来实现运动效果,比如玩家角色的跳跃、物体的推动等。 使用Rigidbody AddForce函数的基本语法是:rigidbody.AddForce(force, mode)。其中,force是要施加的力的大小和方向,而mode是施加力的模式。 force参数可以是一个三维向量(Vector3),表示力的大小和方向。例如,如果我们想要给一个物体施加向上的力,可以这样写:rigidbody.AddForce(Vector3.up * forceAmount),其中forceAmount表示力的大小。 mode参数可以是ForceMode枚举类型的值。ForceMode枚举包括以下几种模式: - Force:在对象上添加一个持续的力,直到力被取消或物体停止。 - Acceleration:对对象施加一个加速力,对物体形成持续的加速度。 - Impulse:对对象施加一个瞬时的力,只持续一个时间步骤。 - VelocityChange:改变对象的速度而不改变对象的质量。 根据具体的需求,我们可以选择合适的模式来施加力。比如,如果我们想要在物体上添加一个持续的力,可以选择Force模式;如果我们只希望物体在某一个时间步骤上受到一个瞬时的力,可以选择Impulse模式。 总之,Unity中的Rigidbody AddForce函数提供了一个方便的方式来给刚体对象施加力,从而实现各种运动效果。在使用时,我们可以根据具体需求选择合适的力大小和方向,以及适当的施加力的模式。 ### 回答3: unity中的Rigidbody组件是用于模拟物体的物理特性的组件,可以实现基于物理的移动和碰撞效果。AddForce()方法Rigidbody组件中的一个函数,用于给物体施加一个力的作用AddForce()方法有多种重载形式,可以传入不同的参数来控制力的作用方式。最常用的重载形式是AddForce(Vector3 force, ForceMode mode),其中force表示施加的力的大小和方向,mode表示力的作用模式。 force参数是一个Vector3类型的变量,用于指定力的大小和方向。可以通过Vector3的构造函数或者直接给x、y、z分量赋值来指定具体的大小和方向,例如Vector3(0, 0, 1)代表施加向上的一个单位力。 mode参数是一个枚举类型的变量,用于指定力的作用模式。有四种可选模式: - Force:在物体上施加持续的力,会受到摩擦和阻力的影响,可以用来实现加速度的效果。 - Impulse:在物体上施加瞬时的力,不受摩擦和阻力的影响,可以用来实现如跳跃的效果。 - VelocityChange:直接改变物体的速度,不受摩擦和阻力的影响,可以用来实现如刹车的效果。 - Acceleration:在物体上施加持续的加速度,不受摩擦和阻力的影响,可以用来实现匀加速运动的效果。 通过调用RigidbodyAddForce()方法,可以给物体施加一个力的作用,实现物体的移动和碰撞效果。根据force和mode的不同组合,可以实现不同的物理效果,使游戏更加真实和动态。
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值