回答編集履歴

6

修正

2021/10/30 11:55

投稿

Hawn
Hawn

スコア1222

test CHANGED
@@ -42,7 +42,7 @@
42
42
 
43
43
  ### ・追記2
44
44
 
45
- 「フラグ管理で初回の一回目は文字送りを発生させない」に関しての修正点。
45
+ **「フラグ管理で初回の一回目は文字送りを発生させない」に関しての修正点。**
46
46
 
47
47
 
48
48
 

5

修正

2021/10/30 11:55

投稿

Hawn
Hawn

スコア1222

test CHANGED
@@ -42,6 +42,10 @@
42
42
 
43
43
  ### ・追記2
44
44
 
45
+ 「フラグ管理で初回の一回目は文字送りを発生させない」に関しての修正点。
46
+
47
+
48
+
45
49
  ・フィールドに`private bool isDoingMessage`を追加。
46
50
 
47
51
  ・`// メッセージ表示中に~`から`// 1回に表示する~`の間部分を下記の様に書き換える。

4

修正

2021/10/30 11:54

投稿

Hawn
Hawn

スコア1222

test CHANGED
@@ -48,7 +48,9 @@
48
48
 
49
49
 
50
50
 
51
- 抜き出して説明するとミスすると思うので全文コピペして使い、問題無ければ内容理解して下さい。
51
+ 抜き出して説明するとミスすると思うので全文コピペして使い、
52
+
53
+ 問題無ければ上記二つの部分の内容理解して下さい。
52
54
 
53
55
 
54
56
 

3

修正

2021/10/30 10:38

投稿

Hawn
Hawn

スコア1222

test CHANGED
@@ -37,3 +37,297 @@
37
37
  **・解決手順**
38
38
 
39
39
  「別キーを使う」若しくは「フラグ管理で初回の一回目は文字送りを発生させない」ようにして下さい。
40
+
41
+
42
+
43
+ ### ・追記2
44
+
45
+ ・フィールドに`private bool isDoingMessage`を追加。
46
+
47
+ ・`// メッセージ表示中に~`から`// 1回に表示する~`の間部分を下記の様に書き換える。
48
+
49
+
50
+
51
+ 抜き出して説明するとミスすると思うので全文コピペして使い、問題無ければ内容理解して下さい。
52
+
53
+
54
+
55
+ ```C#
56
+
57
+ using UnityEngine;
58
+
59
+ using System.Collections;
60
+
61
+ using UnityEngine.UI;
62
+
63
+ using System.Text.RegularExpressions;
64
+
65
+
66
+
67
+ public class Message : MonoBehaviour
68
+
69
+ {
70
+
71
+
72
+
73
+ // メッセージUI
74
+
75
+ private Text messageText;
76
+
77
+ // 表示するメッセージ
78
+
79
+ [SerializeField]
80
+
81
+ [TextArea(1, 20)]
82
+
83
+ private string allMessage;
84
+
85
+
86
+
87
+ // 使用する分割文字列
88
+
89
+ [SerializeField]
90
+
91
+ private string splitString = "<>";
92
+
93
+ // 分割したメッセージ
94
+
95
+ private string[] splitMessage;
96
+
97
+ // 分割したメッセージの何番目か
98
+
99
+ private int messageNum;
100
+
101
+ // テキストスピード
102
+
103
+ [SerializeField]
104
+
105
+ private float textSpeed = 0.05f;
106
+
107
+ // 経過時間
108
+
109
+ private float elapsedTime = 0f;
110
+
111
+ // 今見ている文字番号
112
+
113
+ private int nowTextNum = 0;
114
+
115
+ // マウスクリックを促すアイコン
116
+
117
+ private Image clickIcon;
118
+
119
+ // クリックアイコンの点滅秒数
120
+
121
+ [SerializeField]
122
+
123
+ private float clickFlashTime = 0.2f;
124
+
125
+ // 1回分のメッセージを表示したかどうか
126
+
127
+ private bool isOneMessage = false;
128
+
129
+ // メッセージをすべて表示したかどうか
130
+
131
+ private bool isEndMessage = false;
132
+
133
+ // メッセージ表示中かどうか
134
+
135
+ private bool isDoingMessage = false;
136
+
137
+
138
+
139
+ void Start()
140
+
141
+ {
142
+
143
+ clickIcon = transform.Find( "Panel/Image" ).GetComponent<Image>();
144
+
145
+ clickIcon.enabled = false;
146
+
147
+ messageText = GetComponentInChildren<Text>();
148
+
149
+ messageText.text = "";
150
+
151
+
152
+
153
+ }
154
+
155
+
156
+
157
+ void Update()
158
+
159
+ {
160
+
161
+ // メッセージが終わっているか、メッセージがない場合はこれ以降何もしない
162
+
163
+ if( isEndMessage || allMessage == null )
164
+
165
+ {
166
+
167
+ return;
168
+
169
+ }
170
+
171
+
172
+
173
+ // 1回に表示するメッセージを表示していない
174
+
175
+ if( !isOneMessage && splitMessage != null )
176
+
177
+ {
178
+
179
+ // テキスト表示時間を経過したらメッセージを追加
180
+
181
+ if( elapsedTime >= textSpeed )
182
+
183
+ {
184
+
185
+ messageText.text += splitMessage[ messageNum ][ nowTextNum ];
186
+
187
+
188
+
189
+ nowTextNum++;
190
+
191
+ elapsedTime = 0f;
192
+
193
+
194
+
195
+ // メッセージを全部表示、または行数が最大数表示された
196
+
197
+ if( nowTextNum >= splitMessage[ messageNum ].Length )
198
+
199
+ {
200
+
201
+ isOneMessage = true;
202
+
203
+ }
204
+
205
+ }
206
+
207
+ elapsedTime += Time.deltaTime;
208
+
209
+
210
+
211
+ // メッセージ表示中にマウスの左ボタンを押したら一括表示
212
+
213
+ if( Input.GetKeyDown( KeyCode.Z ) && isDoingMessage) {
214
+
215
+ // ここまでに表示しているテキストに残りのメッセージを足す
216
+
217
+ messageText.text += splitMessage[ messageNum ].Substring( nowTextNum );
218
+
219
+ isOneMessage = true;
220
+
221
+ isDoingMessage = false;
222
+
223
+ }
224
+
225
+ isDoingMessage = true;
226
+
227
+
228
+
229
+ // 1回に表示するメッセージを表示した
230
+
231
+ }
232
+
233
+ else
234
+
235
+ {
236
+
237
+
238
+
239
+ elapsedTime += Time.deltaTime;
240
+
241
+
242
+
243
+ // クリックアイコンを点滅する時間を超えた時、反転させる
244
+
245
+ if( elapsedTime >= clickFlashTime )
246
+
247
+ {
248
+
249
+ clickIcon.enabled = !clickIcon.enabled;
250
+
251
+ elapsedTime = 0f;
252
+
253
+ }
254
+
255
+
256
+
257
+ // マウスクリックされたら次の文字表示処理
258
+
259
+ if( Input.GetKeyDown( KeyCode.Z )){
260
+
261
+ nowTextNum = 0;
262
+
263
+ messageNum++;
264
+
265
+ messageText.text = "";
266
+
267
+ clickIcon.enabled = false;
268
+
269
+ elapsedTime = 0f;
270
+
271
+ isOneMessage = false;
272
+
273
+
274
+
275
+ // メッセージが全部表示されていたらゲームオブジェクト自体の削除
276
+
277
+ if( splitMessage != null && messageNum >= splitMessage.Length )
278
+
279
+ {
280
+
281
+ isEndMessage = true;
282
+
283
+ transform.GetChild( 0 ).gameObject.SetActive( false );
284
+
285
+ }
286
+
287
+ }
288
+
289
+ }
290
+
291
+ }
292
+
293
+ // 新しいメッセージを設定
294
+
295
+ void SetMessage( string message )
296
+
297
+ {
298
+
299
+ this.allMessage = message;
300
+
301
+ // 分割文字列で一回に表示するメッセージを分割する
302
+
303
+ splitMessage = Regex.Split( allMessage, @"\s*" + splitString + @"\s*", RegexOptions.IgnorePatternWhitespace );
304
+
305
+ nowTextNum = 0;
306
+
307
+ messageNum = 0;
308
+
309
+ messageText.text = "";
310
+
311
+ isOneMessage = false;
312
+
313
+ isEndMessage = false;
314
+
315
+ isDoingMessage = false;
316
+
317
+ }
318
+
319
+ // 他のスクリプトから新しいメッセージを設定しUIをアクティブにする
320
+
321
+ public void SetMessagePanel( string message )
322
+
323
+ {
324
+
325
+ SetMessage( message );
326
+
327
+ transform.GetChild( 0 ).gameObject.SetActive( true );
328
+
329
+ }
330
+
331
+ }
332
+
333
+ ```

2

修正

2021/10/30 10:30

投稿

Hawn
Hawn

スコア1222

test CHANGED
@@ -24,7 +24,7 @@
24
24
 
25
25
 
26
26
 
27
- > 引用テキストしかし、メッセージ"こおりでできたいえだ。"を3回表示した後、"おや?かゆいところがあるようだ"を表示するまで、文字が一文字ずつ出ず、いっぺんに表示されてしまいます。
27
+ > しかし、メッセージ"こおりでできたいえだ。"を3回表示した後、"おや?かゆいところがあるようだ"を表示するまで、文字が一文字ずつ出ず、いっぺんに表示されてしまいます。
28
28
 
29
29
 
30
30
 

1

追記

2021/10/26 14:26

投稿

Hawn
Hawn

スコア1222

test CHANGED
@@ -15,3 +15,25 @@
15
15
  **・解決手順**
16
16
 
17
17
  Messageがアタッチされているオブジェクトをドラッグ&ドロップしてNoneを解消して下さい。
18
+
19
+
20
+
21
+ ### ・追記
22
+
23
+ 質問の内容が変更されているので追記します。
24
+
25
+
26
+
27
+ > 引用テキストしかし、メッセージ"こおりでできたいえだ。"を3回表示した後、"おや?かゆいところがあるようだ"を表示するまで、文字が一文字ずつ出ず、いっぺんに表示されてしまいます。
28
+
29
+
30
+
31
+ **・原因**
32
+
33
+ 「メッセージの呼び出し」と「文字送り」を`Input.GetKeyDown(KeyCode.Z)`の同キーでおこなっている為です。
34
+
35
+
36
+
37
+ **・解決手順**
38
+
39
+ 「別キーを使う」若しくは「フラグ管理で初回の一回目は文字送りを発生させない」ようにして下さい。