2015-12-12 39 views
0

我有一個協同程序,每當玩家到達遊戲中的某個點時,我的相機就會向上移動。我使用了協同程序,以便相機隨着時間的推移平穩移動。隨着時間的推移統一協程運動不一致/準確?

這裏是我的代碼片段:

private IEnumerator MoveCameraUpCoroutine(Vector3 startPos, Vector3 endPos, float duration) 
    { 
     float elapsedTime = 0; 
     while(elapsedTime < duration) 
     { 
      transform.position = Vector3.Lerp(startPos, endPos, (elapsedTime/duration)); 
      elapsedTime += Time.deltaTime; 
      yield return null; 
     } 
    } 

public void MoveCameraUp(Vector3 startPos, Vector3 endPos, float duration) 
    { 
     StartCoroutine(MoveCameraUpCoroutine(startPos, endPos, duration)); 
    } 

在我的控制器腳本,我只是叫我協同程序是這樣的:

 cam.GetComponent<CameraMovement>().MoveCameraUp(cam.transform.position, 
                 new Vector3(cam.transform.position.x, cam.transform.position.y + setupLevel.heightOfBlock, cam.transform.position.z), 
                 0.1f); 

的問題,這是相機的運動並不總是在應該停止的地方保持一致。我做了一些調試。在第一次運行時,相機移動到了0.7864508 yPos。第二次運行時,相機移至0.7789915 yPos。等不一致。

但是當我簡單地使用Translate而不是我的協程:

cam.transform.Translate(0, setupLevel.heightOfBlock, 0); 

我在0.7876318得到相機的yPos一致的最終價值,這正是我需要的。但是這段代碼並不能平穩地移動相機,這不是我想要的。

有誰知道如何解決這個協程問題?我不知道,但我認爲我的協程代碼有問題。任何幫助是極大的讚賞。

+0

當你說Translate不能平穩地移動相機時,你能詳細說明一下你的意思嗎? –

+0

@VenkatatAxiomStudios我的意思是,如果我簡單地稱爲翻譯,它不會隨着時間的推移相機。該動作看起來像是相機從pointA傳送到pointB,希望有意義 – aresz

回答

0
float elapsedTime = 0; 
    float ratio = elapsedTime/duration; 
    while(ratio < 1f) 
    { 
     elapsedTime += Time.deltaTime; 
     ratio = elapsedTime/duration; 
     transform.position = Vector3.Lerp(startPos, endPos, ratio);  
     yield return null; 
    } 

有了這個設置,你的循環將持續到比爲1 1時,返回endPos退出循環下一輪。

我認爲問題在於你比較了elapsedTime和持續時間。所以在最後一輪,你移動然後你增加,你比較。結果,最後一次增加不被考慮,你最終在某個地方接近結束,但不會結束。

+0

我試過了你寫的代碼片段,它效果很好!我的相機的yPos得到了一致的最終值,這正是我所需要的。感謝您的解釋。 – aresz

1

結果實際上與預期相符。你的代碼絕對沒有錯,而是因爲幀速差異。

您看到細微差異的原因是因爲不能保證兩個幀將需要精確的渲染時間。在這條線

elapsedTime += Time.deltaTime; 

你在做什麼這裏將不一致的價值,你經過的時間 看看。 (即每幀的Time.deltaTime不同)。

一個部分修復可能是使用Time.smoothDeltaTime代替,這是幾個幀中的deltaTime的平滑值。但是,這不會是完美的。

第二種方法(本身並不完全是答案,但我將此留給其他人使用)是使用補間引擎,如DoTweeniTween。這些引擎有基本上做你想做的事情的方法。

+0

啊我看到了......我之前使用過'DoTween',我想我可以走這條路。但出於好奇,沒有一種方法可以在不使用補間引擎的情況下正常工作? – aresz

相關問題