以下サイトを参考に
https://gametukurikata.com/program/rpgmessage
メッセージ表示機能を実装しました。一文字ずつスムーズに表示されるのですが、一部分の文字の色変えを
<color=#ff0000>***</color>と表記した場合に、この命令文<color=#ff0000></color>も一文字ずつ表示され、全て表示され終わった後に色が変わります。おそらく、文字を区切って一文字ずつ表示している際に色の命令だと認識されていないのだと思いますが、回避する方法はありますでしょうか?
一文字ずつ表示する、という条件なので一文字ずつ<color=#ff0000></color>で囲むという発想はあるのですが、その際にもやはり命令の表示を避ける事は出来ないので悩んでいます。
以下は、参考にしたコードです。
C#
1using UnityEngine; 2using System.Collections; 3using UnityEngine.UI; 4using System.Text.RegularExpressions; 5 6public class Message : MonoBehaviour { 7 8 // メッセージUI 9 private Text messageText; 10 // 表示するメッセージ 11 [SerializeField] 12 [TextArea(1, 20)] 13 private string allMessage = "今回はRPGでよく使われるメッセージ表示機能を作りたいと思います。\n" 14 + "メッセージが表示されるスピードの調節も可能であり、改行にも対応します。\n" 15 + "改善の余地がかなりありますが、 最低限の機能は備えていると思われます。\n" 16 + "ぜひ活用してみてください。\n<>" 17 + "あああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああ" 18 + "あああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああ" 19 + "あああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああ" 20 + "あああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああ" 21 + "あああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああ<>" 22 + "あああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああ" 23 + "あああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああ" 24 + "あああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああ" 25 + "あああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああ<>" 26 + "あああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああ" 27 + "あああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああ" 28 + "あああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああ" 29 + "あああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああ"; 30 // 使用する分割文字列 31 [SerializeField] 32 private string splitString = "<>"; 33 // 分割したメッセージ 34 private string[] splitMessage; 35 // 分割したメッセージの何番目か 36 private int messageNum; 37 // テキストスピード 38 [SerializeField] 39 private float textSpeed = 0.05f; 40 // 経過時間 41 private float elapsedTime = 0f; 42 // 今見ている文字番号 43 private int nowTextNum = 0; 44 // マウスクリックを促すアイコン 45 private Image clickIcon; 46 // クリックアイコンの点滅秒数 47 [SerializeField] 48 private float clickFlashTime = 0.2f; 49 // 1回分のメッセージを表示したかどうか 50 private bool isOneMessage = false; 51 // メッセージをすべて表示したかどうか 52 private bool isEndMessage = false; 53 54 void Start() { 55 clickIcon = transform.Find("Panel/Image").GetComponent<Image>(); 56 clickIcon.enabled = false; 57 messageText = GetComponentInChildren<Text>(); 58 messageText.text = ""; 59 SetMessage(allMessage); 60 } 61 62 void Update() { 63 // メッセージが終わっているか、メッセージがない場合はこれ以降何もしない 64 if (isEndMessage || allMessage == null) { 65 return; 66 } 67 68 // 1回に表示するメッセージを表示していない 69 if (!isOneMessage) { 70 // テキスト表示時間を経過したらメッセージを追加 71 if (elapsedTime >= textSpeed) { 72 messageText.text += splitMessage[messageNum][nowTextNum]; 73 74 nowTextNum++; 75 elapsedTime = 0f; 76 77 // メッセージを全部表示、または行数が最大数表示された 78 if (nowTextNum >= splitMessage[messageNum].Length) { 79 isOneMessage = true; 80 } 81 } 82 elapsedTime += Time.deltaTime; 83 84 // メッセージ表示中にマウスの左ボタンを押したら一括表示 85 if (Input.GetMouseButtonDown(0)) { 86 // ここまでに表示しているテキストに残りのメッセージを足す 87 messageText.text += splitMessage[messageNum].Substring(nowTextNum); 88 isOneMessage = true; 89 } 90 // 1回に表示するメッセージを表示した 91 } else { 92 93 elapsedTime += Time.deltaTime; 94 95 // クリックアイコンを点滅する時間を超えた時、反転させる 96 if (elapsedTime >= clickFlashTime) { 97 clickIcon.enabled = !clickIcon.enabled; 98 elapsedTime = 0f; 99 } 100 101 // マウスクリックされたら次の文字表示処理 102 if (Input.GetMouseButtonDown(0)) { 103 nowTextNum = 0; 104 messageNum++; 105 messageText.text = ""; 106 clickIcon.enabled = false; 107 elapsedTime = 0f; 108 isOneMessage = false; 109 110 // メッセージが全部表示されていたらゲームオブジェクト自体の削除 111 if (messageNum >= splitMessage.Length) { 112 isEndMessage = true; 113 transform.GetChild(0).gameObject.SetActive(false); 114 } 115 } 116 } 117 } 118 // 新しいメッセージを設定 119 void SetMessage(string message) { 120 this.allMessage = message; 121 // 分割文字列で一回に表示するメッセージを分割する 122 splitMessage = Regex.Split(allMessage, @"\s*" + splitString + @"\s*", RegexOptions.IgnorePatternWhitespace); 123 nowTextNum = 0; 124 messageNum = 0; 125 messageText.text = ""; 126 isOneMessage = false; 127 isEndMessage = false; 128 } 129 // 他のスクリプトから新しいメッセージを設定しUIをアクティブにする 130 public void SetMessagePanel(string message) { 131 SetMessage(message); 132 transform.GetChild(0).gameObject.SetActive(true); 133 } 134}
<から>までを除いた処理を追加
C#
1 // 1回に表示するメッセージを表示していない 2 if (!isOneMessage) 3 { 4 // テキスト表示 時間を経過したらメッセージを追加 5 if (elapsedTime >= textSpeed) 6 { 7 //<から>までを除く 8 if (string.Compare("<", splitMessage[messageNum][nowTextNum].ToString(), ignoreCase: true) == 0) 9 { 10 //>来るまで繰り返し 11 while (string.Compare(">", splitMessage[messageNum][nowTextNum].ToString(), ignoreCase: true) != 0) 12 { 13 nowTextNum++; 14 } 15 nowTextNum++; 16 } 17 18 messageText.text += splitMessage[messageNum][nowTextNum]; 19 20 nowTextNum++; 21 elapsedTime = 0f; 22 23 // メッセージを全部表示、または行数が最大数表示された 24 if (nowTextNum >= splitMessage[messageNum].Length) 25 { 26 isOneMessage = true; 27 } 28 }
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/10/07 09:38 編集
2020/10/07 09:42
2020/10/07 11:25
2020/10/07 14:03