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方法,用来判断代码执行是否顺利,其次就是删除,删除部分逻辑,再测试功能是否正常,这个方法对于寻找问题而言应该还是蛮好用的。

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

猜你喜欢

转载自blog.csdn.net/tom_jjJack/article/details/125816832