2016-04-09 7 views
0

アレイからメッセージを順番に表示したい。しかし、最後のメッセージは配列にしか表示されません。 StartCoroutine()を使用してコードが3秒後に遅れるIEnumeratorを呼び出しました。しかし、遅延の後、配列内の最後のメッセージだけが表示されます。unity3dで3秒後に配列からテキストメッセージを表示

using UnityEngine; 
using System.Collections; 
using UnityEngine.UI; 
public class WelcomeMessage : MonoBehaviour { 

    private string startMessage="Hello Player,It's Time to start Learning the Video Game Development"; 
    private string[] messages = { "Now, First Complete Your First Assingment","Find Treasure","Kill them" }; 

    public GameObject canvas; 

    public Text Message; 
    void Start() { 
     setInitialization(); 
     showMessage(); 
    } 

    void setInitialization() 
    { 
     Message = GameObject.Find("welcomeMessage").GetComponent<Text>(); 


    } 
    void showMessage() 
    { 

     Message.text = startMessage; 
     for (int i = 0; i < messages.Length; i++) 
     { 
      StartCoroutine(disableCanvas(messages[i])); 
     } 
    } 

    IEnumerator disableCanvas(string msg) 
    { 

     yield return new WaitForSeconds(3); 
     Message.resizeTextForBestFit = false; 
     Message.fontSize = 20; 
     Message.text = msg; 

     Message.alignment = TextAnchor.UpperLeft; 
    } 
} 
+0

問題を解決したにもかかわらず答えとして選択されていない質問があると思います。人々があなたの質問に答えてそれがあなたの問題を解決した場合は、答えとしてソリューションを選択します。 1つの例外は、問題が解決されない場合です。 – Programmer

+0

解答としてどこから答えを選ぶかわからない。 –

+0

答えの左上にあるチェックマークをクリックしてください。 http://i.imgur.com/GWuYsNn.png – Programmer

答えて

0
  1. それは、単純な論理エラーです。同時に3つのコルーチンを開始するので、Messageは最後に設定されます。

  2. あなたがしたいことは、Messageを1つずつ設定します。

    IEnumerator showMessage(string[] msgs /*, firstTime, secondTime */) 
    { 
        // Here for keeping to display the start message. 
        yield return new WaitForSeconds(firstTime); 
    
        for (int i = 0; i < msgs.Length; i++) 
        { 
         // Set Message Expressions 
    
         // Here for keeping to display the previous message 
         yield return new WaitForSeconds(secondTime); 
        } 
    } 
    
  3. UnityスクリプトでGameObject.Find()を使用しないでください。 (あなたはこのヒントについて多くのコンテンツをGoogleに送ることができます)

+0

彼は 'Start'関数で' GameObject.Find() 'を一度やっていますが、それはまったく問題ありません。あなたがここに当てはまらないすべてのフレームを行うなら、それは悪いことです... – Programmer

0

ためのループには待ち時間がないので、最初のテキストは2つ目のテキストで表示され、すぐに上書きされます。

あなたは、各ループの後を待つdisableCanvas関数内forループを行い、その後IEnumerator disableCanvas(string []msg)にごIEnumerator disableCanvas(string msg)を変更することにより、それを修正して。これはの各テキストがと表示されることを保証します。

新しいコード:

void Start() 
    { 
     setInitialization(); 
     showMessage(); 
    } 

    void setInitialization() 
    { 
     Message = GameObject.Find("welcomeMessage").GetComponent<Text>(); 
    } 

    void showMessage() 
    { 

     StartCoroutine(disableCanvas(messages)); 
    } 

    IEnumerator disableCanvas(string[] msg) 
    { 
     //Waiting time(Change to whatever value) 
     float waitTime = 3; 

     //Display the first message that is NOT in the array 
     Message.text = startMessage; 

     //Wait before starting to display each message in the array 
     yield return new WaitForSeconds(waitTime); 


     for (int i = 0; i < msg.Length; i++) 
     { 
      Message.resizeTextForBestFit = false; 
      Message.fontSize = 20; 
      Message.text = msg[i]; 

      Message.alignment = TextAnchor.UpperLeft; 
      yield return new WaitForSeconds(waitTime); 
     } 
    } 
関連する問題