前提・実現したいこと
UnityでRPGの会話ウインドウにTextのUIを使って、セリフが1字ずつ表示されるような仕組みを作っています。色々調べ、時間を空けて処理をする方法にコルーチンとTime.deltatimeの2種類の方法が見つかりました。
発生している問題・エラーメッセージ
コルーチンを使ったプログラムでは指定した秒間で1字ずつ表示され、やりたいことを実現できたのですがTime.deltatimeを使った方法は1字ずつ表示されているようには見えず、全文一度に表示されるように見えます。
そこで本当に指定した時間が経過した後に処理がされているのか確かめるために経過時間をConsoleに表示させてみましたが明らかに10秒はたっていないのに10.00884が文字数分表示されました。
人物と接触したらenterが表示され、指定したキーを押すと文字を表示する処理が入ります。下の画像は接触した後、2秒後に指定したキーを押した瞬間に経過時間が10.00884と表示されたものです。
Time.deltatimeの使い方が間違っているのでしょうか?それとも別の問題があるのでしょうか?
該当のソースコード
C#
1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using UnityEngine.UI; 5 6public class windowController : MonoBehaviour 7{ 8 [SerializeField] Text messageText; //messageTextを取得する。テキストを書き換えるのにつかう。 9 [SerializeField] GameObject windowPanel; //windowPanelを取得する。windowPanelのアクティブ化に使う。 10 private int nowLetterNum = 0; //現在の文字番号(文字数) 11 [SerializeField] float speed; //1文字あたりの表示される時間 12 private float elapsedTime = 0; //経過時間 13 private int dummy = 0; 14 15 // Start is called before the first frame update 16 void Start() 17 { 18 19 } 20 21 public void DisplayMessage(string ms) 22 { 23 messageText.text = ""; 24 windowPanel.SetActive(true); //windowPanelをアクティブにする。 25 for (nowLetterNum=0; nowLetterNum<ms.Length; dummy++) ←dummyはテキトーな変数です。 26 { 27 if (elapsedTime > speed) 28 { 29 Debug.Log(elapsedTime); 30 messageText.text += ms[nowLetterNum]; //入ってきたメッセージを表示する。 31 nowLetterNum++; 32 elapsedTime = 0; 33 } 34 elapsedTime += Time.deltaTime; 35 36 } 37 38 } 39 40 // Update is called once per frame 41 void Update() 42 { 43 44 } 45 46 47} 48 49
別のスクリプトからDisplayMessageを引数にセリフを入れて呼び出すようにしてます。
PanelのwindowPanelには子要素として会話ウインドウのImage、TextのmessageTextが取り付けられています。そのためPanelをアクティブにすることで会話ウインドウとTextがアクティブになります。
試したこと
Consoleに経過時間を表示してみた。
補足情報(FW/ツールのバージョンなど)
Unity
m_EditorVersion: 2019.4.17f1
m_EditorVersionWithRevision: 2019.4.17f1 (667c8606c536)
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/03/06 05:35
2021/03/06 10:21
2021/03/06 10:26
2021/03/06 10:33