Loading...
墨滴

SimFg

2021/10/20  阅读:49  主题:全栈蓝

小知识,大天地

公众号:SimFG,期待与你相遇

最近在自己开发一个小游戏,准备拿去骗[bi]钱[sai]。开发过程中也遇到了一些细节上的问题,也查询了比较多的资料,发现看其他人写游戏和自己写游戏有很大区别,开发真的是,困难重重。

一个小问题

游戏里面,想实现物体类似于抛物线的运动,主要用于玩家碰到障碍的时候会被弹回来的效果。直接的想法就是直接添加一个斜上方的力就可以了。

void FixedUpdate()
{
    if (Input.GetKeyDown(KeyCode.J))
    {
        rigidBody.AddForce(new Vector2(jumpForce, jumpForce), ForceMode2D.Impulse);
    }
}

这样处理之后,测试的时候就发现有时候按键按下去不灵敏,按下去没有反应。这个部分放在FixedUpdate方法中没有放在Update方法中是因为,rigidBody的物理操作放在这个方法里可以避免不同设备的一致性问题。

原因分析

这个方法里就两行代码,rigidBody这个操作放在这里应该是没有啥问题,那么有可能就是因为获取Input输入这部分引起的。Update与FixedUpdate的区别就是,前者会根据不同设备,在一秒中调用不同次数,后者则无论什么设备都是调用固定次数,默认是50次。

大胆假设:在一些性能较好的设备上,按下了按键,加入这时候正好在0.02s的间隔中,就没有调用FixedUpdate方法,过了一段时间,按键已经不是Down的状态,而是已经按下的状态,自然这个时候就不会触发if语句中内部的逻辑了。

验证

void Update()
{
    if (rigidBody.velocity.sqrMagnitude > 0.0f)
    {
        Instantiate(pointPerfab, gameObject.transform.position, Quaternion.identity);
    }
}

void FixedUpdate()
{
    if (isJump)
    {
        rigidBody.AddForce(new Vector2(jumpForce, jumpForce), ForceMode2D.Impulse);
        isJump = false;
    }
}

然后游戏跑起来,然后就可以疯狂的按了,再也不会按键失效了。 tinghao

深入思考

真的是抛物线吗

于是就啪啦啪啦,写了一点代码,把物体的运动轨迹都写出来了。

if (rigidBody.velocity.sqrMagnitude > 0.0f)
{
    Instantiate(pointPerfab, gameObject.transform.position, Quaternion.identity);
}
物体运动轨迹
物体运动轨迹

看这没啥毛病,就是抛物线了。

ForceMode2D.Impulse

这个的含义是什么呢,简单一查,看的最多的解释就是,这是瞬间添加一个力,然后...没了。 screenshot2 在了解这两个值的真正含义前,先简单介绍一下牛顿定律是什么,我一下子忘掉了。 screenshot3 screenshot4 根据这个,可以得出一个公式:

F = m * (dv / dt); ==> F * dt = m * dv;

ForceMode.Force:默认方式,使用刚体的质量计算,以每帧间隔时间为单位计算动量。设FixedUpdate()的执行频率采用系统默认值(即0.02s),如果给质量为1的物体施加x方向大小为5的力,那么dv为0.1。 screenshot5

ForceMode.Impulse:此种方式采用瞬间力作用方式,即把t的值默认为1,不再采用系统的帧频间隔。那个使用上诉同样的物体,这个时候dv应该为5。 screenshot6

SimFg

2021/10/20  阅读:49  主题:全栈蓝

作者介绍

SimFg