teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

6

修正

2021/10/30 11:55

投稿

Hawn
Hawn

スコア1222

answer CHANGED
@@ -20,7 +20,7 @@
20
20
  「別キーを使う」若しくは「フラグ管理で初回の一回目は文字送りを発生させない」ようにして下さい。
21
21
 
22
22
  ### ・追記2
23
- 「フラグ管理で初回の一回目は文字送りを発生させない」に関しての修正点。
23
+ **「フラグ管理で初回の一回目は文字送りを発生させない」に関しての修正点。**
24
24
 
25
25
  ・フィールドに`private bool isDoingMessage`を追加。
26
26
  ・`// メッセージ表示中に~`から`// 1回に表示する~`の間部分を下記の様に書き換える。

5

修正

2021/10/30 11:55

投稿

Hawn
Hawn

スコア1222

answer CHANGED
@@ -20,6 +20,8 @@
20
20
  「別キーを使う」若しくは「フラグ管理で初回の一回目は文字送りを発生させない」ようにして下さい。
21
21
 
22
22
  ### ・追記2
23
+ 「フラグ管理で初回の一回目は文字送りを発生させない」に関しての修正点。
24
+
23
25
  ・フィールドに`private bool isDoingMessage`を追加。
24
26
  ・`// メッセージ表示中に~`から`// 1回に表示する~`の間部分を下記の様に書き換える。
25
27
 

4

修正

2021/10/30 11:54

投稿

Hawn
Hawn

スコア1222

answer CHANGED
@@ -23,7 +23,8 @@
23
23
  ・フィールドに`private bool isDoingMessage`を追加。
24
24
  ・`// メッセージ表示中に~`から`// 1回に表示する~`の間部分を下記の様に書き換える。
25
25
 
26
- 抜き出して説明するとミスすると思うので全文コピペして使い、問題無ければ内容理解して下さい。
26
+ 抜き出して説明するとミスすると思うので全文コピペして使い、
27
+ 問題無ければ上記二つの部分の内容理解して下さい。
27
28
 
28
29
  ```C#
29
30
  using UnityEngine;

3

修正

2021/10/30 10:38

投稿

Hawn
Hawn

スコア1222

answer CHANGED
@@ -17,4 +17,151 @@
17
17
  「メッセージの呼び出し」と「文字送り」を`Input.GetKeyDown(KeyCode.Z)`の同キーでおこなっている為です。
18
18
 
19
19
  **・解決手順**
20
- 「別キーを使う」若しくは「フラグ管理で初回の一回目は文字送りを発生させない」ようにして下さい。
20
+ 「別キーを使う」若しくは「フラグ管理で初回の一回目は文字送りを発生させない」ようにして下さい。
21
+
22
+ ### ・追記2
23
+ ・フィールドに`private bool isDoingMessage`を追加。
24
+ ・`// メッセージ表示中に~`から`// 1回に表示する~`の間部分を下記の様に書き換える。
25
+
26
+ 抜き出して説明するとミスすると思うので全文コピペして使い、問題無ければ内容理解して下さい。
27
+
28
+ ```C#
29
+ using UnityEngine;
30
+ using System.Collections;
31
+ using UnityEngine.UI;
32
+ using System.Text.RegularExpressions;
33
+
34
+ public class Message : MonoBehaviour
35
+ {
36
+
37
+ // メッセージUI
38
+ private Text messageText;
39
+ // 表示するメッセージ
40
+ [SerializeField]
41
+ [TextArea(1, 20)]
42
+ private string allMessage;
43
+
44
+ // 使用する分割文字列
45
+ [SerializeField]
46
+ private string splitString = "<>";
47
+ // 分割したメッセージ
48
+ private string[] splitMessage;
49
+ // 分割したメッセージの何番目か
50
+ private int messageNum;
51
+ // テキストスピード
52
+ [SerializeField]
53
+ private float textSpeed = 0.05f;
54
+ // 経過時間
55
+ private float elapsedTime = 0f;
56
+ // 今見ている文字番号
57
+ private int nowTextNum = 0;
58
+ // マウスクリックを促すアイコン
59
+ private Image clickIcon;
60
+ // クリックアイコンの点滅秒数
61
+ [SerializeField]
62
+ private float clickFlashTime = 0.2f;
63
+ // 1回分のメッセージを表示したかどうか
64
+ private bool isOneMessage = false;
65
+ // メッセージをすべて表示したかどうか
66
+ private bool isEndMessage = false;
67
+ // メッセージ表示中かどうか
68
+ private bool isDoingMessage = false;
69
+
70
+ void Start()
71
+ {
72
+ clickIcon = transform.Find( "Panel/Image" ).GetComponent<Image>();
73
+ clickIcon.enabled = false;
74
+ messageText = GetComponentInChildren<Text>();
75
+ messageText.text = "";
76
+
77
+ }
78
+
79
+ void Update()
80
+ {
81
+ // メッセージが終わっているか、メッセージがない場合はこれ以降何もしない
82
+ if( isEndMessage || allMessage == null )
83
+ {
84
+ return;
85
+ }
86
+
87
+ // 1回に表示するメッセージを表示していない
88
+ if( !isOneMessage && splitMessage != null )
89
+ {
90
+ // テキスト表示時間を経過したらメッセージを追加
91
+ if( elapsedTime >= textSpeed )
92
+ {
93
+ messageText.text += splitMessage[ messageNum ][ nowTextNum ];
94
+
95
+ nowTextNum++;
96
+ elapsedTime = 0f;
97
+
98
+ // メッセージを全部表示、または行数が最大数表示された
99
+ if( nowTextNum >= splitMessage[ messageNum ].Length )
100
+ {
101
+ isOneMessage = true;
102
+ }
103
+ }
104
+ elapsedTime += Time.deltaTime;
105
+
106
+ // メッセージ表示中にマウスの左ボタンを押したら一括表示
107
+ if( Input.GetKeyDown( KeyCode.Z ) && isDoingMessage) {
108
+ // ここまでに表示しているテキストに残りのメッセージを足す
109
+ messageText.text += splitMessage[ messageNum ].Substring( nowTextNum );
110
+ isOneMessage = true;
111
+ isDoingMessage = false;
112
+ }
113
+ isDoingMessage = true;
114
+
115
+ // 1回に表示するメッセージを表示した
116
+ }
117
+ else
118
+ {
119
+
120
+ elapsedTime += Time.deltaTime;
121
+
122
+ // クリックアイコンを点滅する時間を超えた時、反転させる
123
+ if( elapsedTime >= clickFlashTime )
124
+ {
125
+ clickIcon.enabled = !clickIcon.enabled;
126
+ elapsedTime = 0f;
127
+ }
128
+
129
+ // マウスクリックされたら次の文字表示処理
130
+ if( Input.GetKeyDown( KeyCode.Z )){
131
+ nowTextNum = 0;
132
+ messageNum++;
133
+ messageText.text = "";
134
+ clickIcon.enabled = false;
135
+ elapsedTime = 0f;
136
+ isOneMessage = false;
137
+
138
+ // メッセージが全部表示されていたらゲームオブジェクト自体の削除
139
+ if( splitMessage != null && messageNum >= splitMessage.Length )
140
+ {
141
+ isEndMessage = true;
142
+ transform.GetChild( 0 ).gameObject.SetActive( false );
143
+ }
144
+ }
145
+ }
146
+ }
147
+ // 新しいメッセージを設定
148
+ void SetMessage( string message )
149
+ {
150
+ this.allMessage = message;
151
+ // 分割文字列で一回に表示するメッセージを分割する
152
+ splitMessage = Regex.Split( allMessage, @"\s*" + splitString + @"\s*", RegexOptions.IgnorePatternWhitespace );
153
+ nowTextNum = 0;
154
+ messageNum = 0;
155
+ messageText.text = "";
156
+ isOneMessage = false;
157
+ isEndMessage = false;
158
+ isDoingMessage = false;
159
+ }
160
+ // 他のスクリプトから新しいメッセージを設定しUIをアクティブにする
161
+ public void SetMessagePanel( string message )
162
+ {
163
+ SetMessage( message );
164
+ transform.GetChild( 0 ).gameObject.SetActive( true );
165
+ }
166
+ }
167
+ ```

2

修正

2021/10/30 10:30

投稿

Hawn
Hawn

スコア1222

answer CHANGED
@@ -11,7 +11,7 @@
11
11
  ### ・追記
12
12
  質問の内容が変更されているので追記します。
13
13
 
14
- > 引用テキストしかし、メッセージ"こおりでできたいえだ。"を3回表示した後、"おや?かゆいところがあるようだ"を表示するまで、文字が一文字ずつ出ず、いっぺんに表示されてしまいます。
14
+ > しかし、メッセージ"こおりでできたいえだ。"を3回表示した後、"おや?かゆいところがあるようだ"を表示するまで、文字が一文字ずつ出ず、いっぺんに表示されてしまいます。
15
15
 
16
16
  **・原因**
17
17
  「メッセージの呼び出し」と「文字送り」を`Input.GetKeyDown(KeyCode.Z)`の同キーでおこなっている為です。

1

追記

2021/10/26 14:26

投稿

Hawn
Hawn

スコア1222

answer CHANGED
@@ -6,4 +6,15 @@
6
6
  ![イメージ説明](756956703cd305f5d7ecd3654faf128b.png)
7
7
 
8
8
  **・解決手順**
9
- Messageがアタッチされているオブジェクトをドラッグ&ドロップしてNoneを解消して下さい。
9
+ Messageがアタッチされているオブジェクトをドラッグ&ドロップしてNoneを解消して下さい。
10
+
11
+ ### ・追記
12
+ 質問の内容が変更されているので追記します。
13
+
14
+ > 引用テキストしかし、メッセージ"こおりでできたいえだ。"を3回表示した後、"おや?かゆいところがあるようだ"を表示するまで、文字が一文字ずつ出ず、いっぺんに表示されてしまいます。
15
+
16
+ **・原因**
17
+ 「メッセージの呼び出し」と「文字送り」を`Input.GetKeyDown(KeyCode.Z)`の同キーでおこなっている為です。
18
+
19
+ **・解決手順**
20
+ 「別キーを使う」若しくは「フラグ管理で初回の一回目は文字送りを発生させない」ようにして下さい。