C# 摄像机跟不上
摄像机应该跟随一个2D字符,下面是代码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
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中设置的,所以它不会像可能的那样平滑,而且我也不确定角色的碰撞检测是否会正常工作,因为我们直接将其位置设置为其变换。问题可能来自如何使用插值来确定相机移动的距离 我不知道
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);
}