閲覧ありがとうございます。
表題の通りなんですが、現在テストでいろいろな関数とかを試していて、
Excelのデータを読み込むことに挑戦しています。
そこで、以下のスクリプトを実行後、適当なInputを行なったときに、
endOfTalkがtrueにならない限り、Story()を先頭からスタートさせたいと思っています。
messageを1回更新したいんですが、いざ入力してみると連続で2回更新されてしまいます。
コルーチンの使い方もあまり詳しくないのですが、このコードだと何がまずいのでしょうか。
ご教授の程、よろしくお願いいたします。
C#
1using System.Collections; 2using System.Collections.Generic; 3using System.Linq; 4using UnityEngine; 5using UnityEngine.UI; 6 7public class TestStory : MonoBehaviour 8{ 9 [SerializeField] TestExcel testExcel; 10 [SerializeField] Text massage;//本文 11 [SerializeField] Text yBranchMassage;//肯定 12 [SerializeField] Text nBranchMassage;//否定 13 [SerializeField] int iD = 0;//文章を検索するときに使うID 14 public List<Sentence> sentences;//=new List<Sentence>(); 15 16 void Start() 17 { 18 sentences.AddRange(testExcel.sentence); 19 StartCoroutine("Story"); 20 } 21 22 IEnumerator Story() 23 { 24 print(iD); 25 massage.text = sentences[iD].message + ":" + sentences[iD].endOfTalk; 26 27 yield return new WaitUntil(() => Input.anyKeyDown); 28 29 iD++; 30 31 if (sentences[iD].endOfTalk) 32 { 33 print("止まった"); 34 yield break; 35 } 36 else 37 { 38 StartCoroutine("Story"); 39 } 40 } 41}
追記
以下のコードだと1回ずつ更新されましたが、なぜ上記だとそうなるのかわかりません。
時間で更新するのではなく、何らかの入力後に更新したいです。
よろしくおねがいします。
c#
1 2 IEnumerator Story() 3 { 4 /*/while文を試しました 5 while (!sentences[iD].endOfTalk) 6 { 7 print(iD); 8 massage.text = sentences[iD].message + ":" + sentences[iD].endOfTalk; 9 10 //yield return new WaitUntil(() => Input.anyKeyDown);//うまくいかない 11 yield return new WaitForSeconds(3);//うまくいった 12 13 iD++; 14 } 15 //*/ 16 17 //* 18 print(iD); 19 massage.text = sentences[iD].message + ":" + sentences[iD].endOfTalk; 20 21 //yield return new WaitUntil(() => Input.anyKeyDown); 22 yield return new WaitForSeconds(3);//ここを変更。うまくいった。 23 24 iD++; 25 26 if (sentences[iD].endOfTalk) 27 { 28 print("止まった"); 29 yield break; 30 } 31 else 32 { 33 StartCoroutine("Story"); 34 } 35 //*/ 36 }
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。