Unity Viewbob 使用 lerp 随机回弹 1 帧

问题描述

我的 ViewBobScript 有问题,它在 1 帧内快速返回到 lerps 起始位置。

这是我的问题的娱乐/视频: (由于视频的帧率与游戏不匹配,它可能看起来好像不流畅,但实际上是。问题是视频开头和结尾的快照,并且似乎以不规则的间隔发生)

https://youtu.be/UOz2pQcMFjY

这是我的代码:

let mockRequest = jest.fn().mockReturnValue({
  appUsers: [
    {
      id: 'tests'
    }
  ]
})

jest.mock('awesome-graphql-client',() => {
  return {
    AwesomeGraphQLClient: jest.fn().mockImplementation(() => {
      return {
        request: () => mockRequest()
      }
    })
  }
})

另外,我知道统一角色控制器有 ViewBobbing。但这不是我的应用程序的选项。

非常感谢您的帮助!

编辑:这是从更新函数调用的,虽然我尝试过固定和延迟更新都不会改变、解决或减少问题。

虽然我的脚本可以运行并且我正在继续我的项目,但如果您知道为什么我上面的代码不起作用/做了 Snap,我将不胜感激,以便我从中学习! >

解决方法

我会采用不同的方法,将 Time.deltaTime 添加到一个字段,然后计算该字段对应的路径和 t 参数。 Mathf.Repeat 对此很有用。

[SerializeField] int pathIndex;
[SerializeField] float pathT;
[SerializeField] float aTimer;

[SerializeField] float pathDuration = 1f; // how long each path takes in seconds

private void ViewBob()
{
    // update aTimer but wrap around at pathDuration x 4 ( [0,4pD) )
    aTimer = Mathf.Repeat(aTimer + Time.deltaTime,pathDuration * 4f);

    // How many path durations is aTimer along? ( {0,1,2,3} )
    pathIndex = Mathf.FloorToInt(aTimer/pathDuration);

    // How far into the current path duration is aTimer?  ( [0,1) )
    pathT = Mathf.Repeat(aTimer,pathDuration) / pathDuration;

    Vector3 fromVector;
    Vector3 toVector;

    // assign to/from vectors based on pathIndex
    switch (pathIndex)
    {
        default:
        case 0:
            fromVector = new Vector3(-viewBobHorizontal / 2,0);
            toVector = new Vector3(0,-viewBobVertical,0);
            break;
        case 1:
            fromVector = new Vector3(0,0);
            toVector = new Vector3(viewBobHorizontal / 2,0);
            break;
        case 2:
            fromVector = new Vector3(viewBobHorizontal / 2,0);
            break;
        case 3:
            fromVector = new Vector3(0,0);
            toVector = new Vector3(-viewBobHorizontal / 2,0);
            break;
    }

    // lerp position based on pathT and the to/from vectors
    playerCam.transform.localPosition = Vector3.Lerp(fromVector,toVector,pathT);
}

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...