2017-04-10 58 views
1

我有一個Coroutine,我嘗試過使用WaitForSecondsRealtimeWaitForSeconds。當我運行Coroutine時,延遲在幾次迭代中是相同的,但是延遲時間稍長一些,然後延遲,然後再次出現延遲。協程正在導致對象之間的間距不均

下面是正在發生的事情的圖像,因爲您可以看到圓圈之間有一些間隙,我希望間隔更加穩定。

Gap

這裏是Coroutine我使用這個:

public float shootDelay = 0.03f; 

IEnumerator Shoot(Vector3 direction) { 
    direction.z = 0f; 
    foreach (GameObject ball in balls) { 
     float speed = ball.GetComponent<Ball>().speed; 
     ball.GetComponent<Ball>().rb.velocity = direction.normalized * speed; 
     yield return new WaitForSecondsRealtime(shootDelay); 
    } 
} 
+0

這傷害了我的眼睛。 *我希望圓圈之間的差距完全相同! – djv

+0

除非您修改'Time.timeScale'變量,否則不需要使用'WaitForSecondsRealtime()'。你目睹的錯誤是由於Unity沒有完全等待'shootDelay',而是在完成shootDelay之後的_frame。 –

+0

我很好奇。如果您使用0.02f作爲拍攝延遲,會發生什麼情況?同樣的結果? 0.3f或0.5f怎麼樣? – JuanR

回答

1

很難從代碼的點點告訴你的問題是什麼。一個好的Minimal, Complete, and Verifiable code example會有很大的幫助(可能減去標準Unity3d樣板文件&hellip;有一種技術可以爲Unity3d問題提供適當的代碼量)。

但是看起來像就像你試圖實現從「某些東西」「射擊」「球」之間的延遲。因此,您希望每個球以精確的時間間隔進行初始化。它們不是,導致不規則的間隔。

不幸的是,我不認爲你可以指望WaitForSecondsRealtime()(或WaitForSeconds(),對於這個問題......這可能是一個更好的選擇,因爲它會自動調整,如果你改變遊戲模擬速度)。 These functions有嚴重的不精確來源,您需要考慮,尤其是等待的時間僅在當前幀完全完成後計算,並且只有在指定時間過後的第一幀纔會恢復協同程序。

考慮到這種不準確的一種方法是使用Time.time值來跟蹤自開始發射子彈以來實際經過了多少模擬時間。在循環之前將協程中的變量初始化爲當前值。然後,當您設置子彈對象的velocity時,還可以根據速度以及當前時間值與該子彈的預期時間值之間的差異來設置它的position。然後等待一段時間不是您想要的確切時間間隔,而是等待一段時間來表示當前時間與下一個子彈時間之間的差異。

沒有好的MCVE這是不實際的,我嘗試進行測試(即我沒有),但這樣的事情應該工作:

IEnumerator Shoot(Vector3 direction) { 
    direction.z = 0f; 
    float nextBulletTime = Time.time; 
    foreach (GameObject ball in balls) { 
     Ball ballComponent = ball.GetComponent<Ball>(); 
     float speed = ballComponent.speed; 
     Rigidbody rb = ballComponent.rb; 

     rb.velocity = direction.normalized * speed; 
     rb.position += rb.velocity * (Time.time - nextBulletTime); 

     nextBulletTime += shootDelay; 
     yield return new WaitForSeconds(nextBulletTime - Time.time); 
    } 
}