質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

1回答

2613閲覧

Unityで一文字ずつ表示されるメッセージ内で、html colorで一部文字を色変えしたい!

Lovedelic_VR

総合スコア24

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2020/10/06 17:10

編集2020/10/07 09:35

以下サイトを参考に
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 }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

アイデアだけですが。
『次に表示する文字が「<」だった場合、その次に「>」が来るまで、ウェイト無し・その部分はmessageText.textに追加しない』
という形で実現可能かと思います。(一括表示する時はタグを除去した文字列を表示)

ただこの場合「大なり・小なりという意味でこの文字を使う場合は全角にすること」というテキストを書く上でのルール付けが必要になります。

投稿2020/10/07 00:52

sakura_hana

総合スコア11427

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Lovedelic_VR

2020/10/07 09:38 編集

「<」だった場合、その次に「>」が来るまで、messageText.textに追加しないという処理を追加してみましたが、テキストコンポーネントにそもそも文字として命令が追加されず、色が変わりませんでした。
Lovedelic_VR

2020/10/07 09:42

おそらく、「<」だった場合、その次に「>」が来るまで、messageText.textに追加しない ではなく、 「<」だった場合、その次に二度「>」が来るまで、messageText.textに一気に追加する、とすればできるのかと思いましたのでそちらも試してみます。
Lovedelic_VR

2020/10/07 11:25

そちらのアプローチで解決しました。回答ありがとうございました。
sakura_hana

2020/10/07 14:03

> messageText.textに一気に追加する こちらの方が正しかったですね、申し訳無いです。解決して何よりです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問