Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 摄像机跟不上_C#_Unity3d_Camera_2d - Fatal编程技术网

C# 摄像机跟不上

C# 摄像机跟不上,c#,unity3d,camera,2d,C#,Unity3d,Camera,2d,摄像机应该跟随一个2D字符,下面是代码 void LateUpdate () { var to = target.position; to.z = transform.position.z; var newPos = Vector3.Lerp(transform.position, to, speed * Time.deltaTime); transform.position = newPos; newPos.z = to.z; Debug.Dra

摄像机应该跟随一个2D字符,下面是代码

void LateUpdate ()
{
    var to = target.position;
    to.z = transform.position.z;
    var newPos = Vector3.Lerp(transform.position, to, speed * Time.deltaTime);
    transform.position = newPos;
    newPos.z = to.z;
    Debug.DrawRay(newPos, Vector3.up, Color.green, 5);
}
我还绘制角色和相机的位置

红线是角色的位置,绿线是相机的位置

我做错了什么

更新:

我发现了一些有趣的事情。在下面的图片上,绿线是由Vector3.Lerp在最新更新方法中移动的相机位置。黄线是角色的位置,我将其设置为角色的Rigidbody2D inside FixedUpdate方法,红线是角色变换的位置,从相机的最新更新中可以看到

我想说的是,角色的实际位置是由其Rigidbody2D组件驱动的。通过更改Rigidbody2D的“插值”选项,我们可以得到不同的结果

问题是,即使我在每次FixedUpdate勾选时将相同的值添加到Rigidbody2D的位置,结果也不太一致。有时新位置和旧位置之间的距离比它应该的大

再加上我们在LateUpdate方法中设置摄影机的位置,它的更新速率与FixedUpdate不同,因此即使我们将新位置设置为角色的变换,而不是刚体,摄影机的移动仍然不会平滑,因为角色的速度每帧都不同

现在我只有一个解决办法

  • 将角色的新位置设置为其变换,而不是刚体
  • 更改相机在其FixedUpdate中的位置,而不是在LateUpdate中的位置
  • 然后这些位置会像这样


    但是由于相机的位置是在FixedUpdate中设置的,所以它不会像可能的那样平滑,而且我也不确定角色的碰撞检测是否会正常工作,因为我们直接将其位置设置为其变换。

    问题可能来自如何使用插值来确定相机移动的距离

    我不知道
    Vector3.Lerp
    的行为是否会外推第三个参数(其分数)是否高于1.0,但我怀疑这可能是问题所在(特别是如果帧之间的时间稍长,并且
    speed*time.DeltaTime
    变得高于1.0)

    一个更好的方法(消除lerp)可以是自己根据速度和时间进行距离插值

    void LateUpdate ()
    {
        var to = target.position;
        to.z = transform.position.z;
        //you can just multiply a Vector3 with a float 
        //so we can do the interpolation maths ourselves like this :
        var distanceToMove = (to - transform.position) * speed * Time.deltaTime; 
        var newPos = transform.position + distanceToMove;
        transform.position = newPos;
        newPos.z = to.z;
        Debug.DrawRay(newPos, Vector3.up, Color.green, 5);
    }
    
    (如果这让人困惑,这里有一个更简洁的版本)


    +1、这不是lerp的使用方式。第三个参数是百分比,您不应该在这里使用增量时间。这个例子可能会被MoveToward取代,但为了更好的相机效果,我更喜欢SmoothDamp:线性插值有一种“无聊”的感觉。嗯,我尝试了你们建议的两种变体,看起来并没有什么变化。我还在Vector3.Lerp函数中使用了一个介于0和1之间的值(大约为0.1),我认为使用Time.deltaTime可以使相机的移动速度独立于帧rate@ChazAshley使用Time.DeltaTime将考虑渲染每个帧所需的时间差异,这样就可以消除速度和帧率的波动。在代码中使用Lerp有点危险,因为它是如何执行插值的。从我在调试屏幕截图中看到的情况来看,每隔9帧左右就会出现问题。尽管建议使用
    lateupdate
    进行此操作,但我对此持怀疑态度。请尝试在将代码移动到
    update
    时查看是否仍然出错。请尝试UnityWiki中的SmoothCamera脚本,您必须进行更改以仅支持二维跟随(只需设置沿z轴的位置常数)。这里是链接:或者我尝试了简单的脚本和改进的脚本,仍然存在问题,我认为问题出在其他方面,而不是代码中。它是否仅在设备中不平滑,或者编辑器和设备都不平滑?还可以尝试在唤醒任何脚本
    Application.targetFrameRate=60时设置此选项它在设备和编辑器中也不平滑,我设置了帧速率,但它没有帮助尝试将质量设置设置为神奇。如果仍然存在相同的问题,请尝试此处提到的其他设置
    
    void LateUpdate ()
    {
        var to = target.position;
        to.z = transform.position.z;
        transform.position += (to - transform.position) * speed * Time.deltaTime; ;
        Debug.DrawRay(transform.position, Vector3.up, Color.green, 5);
    }