2017-08-01 31 views
2

相机应该遵循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); 
} 

我也画人物和摄像头的位置。

红线是人物的位置,和绿线是相机的位置

enter image description here

我该怎么办错了吗?

UPDATE:

我已经想通了一些有趣的事情。在下面的图片中,绿线是由LateUpdate方法内的Vector3.Lerp移动的相机的位置。黄线是我在固定更新方法中为角色的Rigidbody2D设置的角色的位置,红线是从相机的LateUpdate内部看到的角色转换的位置。

enter image description here

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

问题是,即使我将每个FixedUpdate滴答的相同值添加到Rigidbody2D的位置,结果也不是那么一致。有时新旧位置之间的距离比应该大。

除此之外,我们在LateUpdate方法中设置相机的位置,该方法与FixedUpdate的更新速率不同,所以即使我们将新位置设置为字符的变换而不是Rigidbody2D, camere仍然不会流畅,因为角色的速度每帧都会有所不同。

现在我只有一个解决方案。

  1. 的字符集的新位置及其变换,而不是在其FixedUpdate的房间的Rigidbody2D
  2. 改变位置,而不是在LateUpdate。

然后位置看起来会像这样

enter image description here

但因为相机的位置在FixedUpdate设置,也不会那么顺利,因为它可能是,也是我”我不确定这个角色的碰撞检测是否能够正常工作,因为我们将其位置直接设置为它的变换。

+0

尝试SmoothCamera脚本,你必须做出改变为仅支持2D如下(只设置位置沿着z轴恒定)。以下是链接: [UnityWiki](http://wiki.unity3d.com/index.php?title=SmoothFollow2&oldid=13960) 或 [UnityWikiCached](http://webcache.googleusercontent.com/search?q=缓存:iYKRX3r1TwUJ:wiki.unity3d.com/index.php/SmoothFollow2+&cd=1&hl=zh-CN&ct=clnk&gl=in&client=firefox-b-ab) –

+0

我试过简单的脚本和改进的脚本,仍然有问题,我认为问题出在别的什么地方,而不是代码 –

+0

在设备上还是在编辑器和设备上都不平滑? 也尝试在任何脚本唤醒设置此Application'targetFrameRate = 60;' –

回答

1

该问题可能来自您如何使用插值来确定移动摄像头的距离。

我不知道如果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); 
} 

(如果有混淆,这里清理的版本,使其更简洁)从UnityWiki

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); 
} 
+0

+1,这不是应该如何使用lerp。第三个参数是一个百分比,你不应该在这里使用delta时间。 这个例子大概可以用MoveTowards替代,但为了更好的相机效果,我更喜欢SmoothDamp:线性插值有一种“无聊”的感觉。 – FLX

+0

@FLX嘿,我不知道SmoothDamp。谢谢。 –

+0

welp,我尝试了两种变体你们都建议,并且它看起来并没有什么变化。我也使用Vector3.Lerp函数(大约0.1)中0和1之间的值,并且我认为使用Time.deltaTime会使相机移动的速度与帧速率无关 –