2016-08-14 68 views
2

我對編程非常陌生,我有一種感覺,這裏有一個非常愚蠢的錯誤。但任何人都可以解釋我,爲什麼4個消息之間延遲2秒,我瞬間得到最後一條消息只顯示。爲什麼我的「收益率」不起作用?

using UnityEngine; 
using System.Collections.Generic; 
using System.Collections; 
using System.Linq; 
using UnityEngine.UI; 

public class Wait : MonoBehaviour { 

    private int i = 0; 
    public string[] message; 

    [SerializeField] 
    private Text toText; 

    public IEnumerator Message(float waitTime) 
    { 
     toText.text = message[i]; 
     i++; 
     yield return new WaitForSeconds(waitTime = 2f); 
    } 

    void Start() 
    { 
     StartCoroutine(Message(i)); 
     StartCoroutine(Message(i)); 
     StartCoroutine(Message(i)); 
     StartCoroutine(Message(i)); 
    } 
} 
+1

關鍵字使得您的方法被延遲執行。因此只有在調用'Enumerator.MoveNext()'時纔會執行它,這是你永遠不會調用的(例如使用for循環)。 – HimBromBeere

+0

@HimBromBeere是不是'StartCoroutine'的工作? –

回答

0
void Start() 
{ 
    StartCoroutine(Message(i)); 
    StartCoroutine(Message(i)); 
    StartCoroutine(Message(i)); 
    StartCoroutine(Message(i)); 
} 

我不認爲這是做你認爲應該的。這將不會等待每個StartCoroutine完成並將調用下一個StartCoroutine

這是發生了什麼:

第一StartCoroutine(Message(i));通話將啓動Message功能。 一旦它符合yield return new WaitForSeconds(waitTime = 2f);代碼行,它將跳回Start()函數。

下一個StartCoroutine(Message(i));將被調用,那麼同樣的事情會再次發生。

當調用從非協程功能的協程功能,只要你有yield return new WaitForSecondsyield return null;yield return什麼有史以來YieldInstruction實施後,執行將返回到,其中非協程功能StartCoroutine函數被調用來自並繼續執行其他代碼。

要使協程等待另一個完成,請從另一個協同程序函數調用StartCoroutine(Message(i));函數。這將允許你對每個協程函數調用yield。這被稱爲鏈式協程。

若要鏈接或yield一個協同函數調用,只需在StartCoroutine函數前面放置yield return即可。現在yield return StartCoroutine(Message(i));

public class Wait : MonoBehaviour { 
    private int i = 0; 
    public string[] message; 

    [SerializeField] 
    private Text toText; 

    public IEnumerator Message(float waitTime) 
    { 
     // toText.text = message[i]; 
     i++; 
     yield return new WaitForSeconds(waitTime = 2f); 
    } 

    void Start() 
    { 
     StartCoroutine(startMessage()); 
    } 

    IEnumerator startMessage() 
    { 
     yield return StartCoroutine(Message(i));//Wait until this coroutine function retuns 
     yield return StartCoroutine(Message(i));//Wait until this coroutine function retuns 
     yield return StartCoroutine(Message(i));//Wait until this coroutine function retuns 
     yield return StartCoroutine(Message(i));//Wait until this coroutine function retuns 
    } 
} 

,每個StartCoroutine(Message(i));通話將等到第一個完成。您可以始終使用boolean變量來執行此操作,但它對yield調用StartCoroutine要好得多。

0

文本設置即時的原因是因爲StartCoroutine將從Message執行枚舉。

發生的前兩件事是設置文本並增加i。只有在完成之後,您纔會產生WaitForSeconds。那時StartCoroutine會暫停執行Message

如果您在yield return之後有一條線,您會在2秒後看到效果。

的例子

在文檔中,你還可以看到yield return Wait https://docs.unity3d.com/ScriptReference/MonoBehaviour.StartCoroutine.html

後的行爲,我建議下次運行測試,以進一步熟悉產量回報是如何工作的:

IEnumerator MessageOuter() { 
    Console.WriteLine("outer 1"); 
    var inner = MessageInner(); 
    Console.WriteLine("outer 2"); 
    return inner; 
} 
IEnumerator MessageInner() { 
    Console.WriteLine("inner 1"); 
    yield return new WaitForSeconds(1); 
    Console.WriteLine("inner 2"); 
    yield return new WaitForSeconds(1); 
    Console.WriteLine("inner 3"); 
} 
void Start() { 
    Console.WriteLine("start 1"); 
    var outer = MessageOuter(); 
    Console.WriteLine("start 2"); 
    StartCoroutine(outer); 
    Console.WriteLine("start 3"); 
} 
相關問題