質問編集履歴

11

文法の修正

2022/01/09 07:35

投稿

AcrossKodez
AcrossKodez

スコア0

test CHANGED
File without changes
test CHANGED
@@ -266,7 +266,7 @@
266
266
 
267
267
 
268
268
 
269
- //ここから左クリックして一気に表示させる処理
269
+ //ここからエンターキーを押して一気に表示させる処理
270
270
 
271
271
  if (Input.GetKeyDown(KeyCode.Return))// もし、メッセージ表示中にエンターキーが押されたら、
272
272
 
@@ -320,7 +320,7 @@
320
320
 
321
321
 
322
322
 
323
- else// エンターがされていなければ、
323
+ else// エンターキーされていなければ、
324
324
 
325
325
  {
326
326
 

10

文法の修正

2022/01/09 07:35

投稿

AcrossKodez
AcrossKodez

スコア0

test CHANGED
File without changes
test CHANGED
@@ -268,7 +268,7 @@
268
268
 
269
269
  //ここから左クリックして一気に表示させる処理
270
270
 
271
- if (Input.GetKeyDown(KeyCode.Return))// もし、メッセージ表示中に左クリックされたら、
271
+ if (Input.GetKeyDown(KeyCode.Return))// もし、メッセージ表示中にエンターキーが押されたら、
272
272
 
273
273
  {
274
274
 
@@ -342,7 +342,7 @@
342
342
 
343
343
  // クリックされたら次の文字を表示する処理
344
344
 
345
- if (Input.GetKeyDown(KeyCode.Return))// もし、クリックされたら、
345
+ if (Input.GetKeyDown(KeyCode.Return))// もし、エンターキーが押されたら、
346
346
 
347
347
  {
348
348
 

9

文法の修正

2022/01/09 07:32

投稿

AcrossKodez
AcrossKodez

スコア0

test CHANGED
File without changes
test CHANGED
@@ -320,7 +320,7 @@
320
320
 
321
321
 
322
322
 
323
- else// クリックされていなければ、
323
+ else// エンターがされていなければ、
324
324
 
325
325
  {
326
326
 

8

書式の改善、文法の改善、スクリプトの情報追加

2022/01/09 07:10

投稿

AcrossKodez
AcrossKodez

スコア0

test CHANGED
File without changes
test CHANGED
@@ -28,6 +28,10 @@
28
28
 
29
29
  よろしくお願いいたします。
30
30
 
31
+
32
+
33
+ ###モブキャラの会話発生スクリプト
34
+
31
35
  ```c#
32
36
 
33
37
  using UnityEngine;
@@ -121,3 +125,313 @@
121
125
  }
122
126
 
123
127
  ```
128
+
129
+ ###セリフと吹き出しの制御スクリプト
130
+
131
+
132
+
133
+ ```C#
134
+
135
+ using UnityEngine;
136
+
137
+ using System.Collections;
138
+
139
+ using UnityEngine.UI;// UI機能を使用するために追記
140
+
141
+
142
+
143
+ public class Message : MonoBehaviour
144
+
145
+ {
146
+
147
+ public bool isActive;// Canvasの表示非表示
148
+
149
+ public GameObject canvas;// 使用するCanvas
150
+
151
+ public Text messageText;// メッセージを表示する文字
152
+
153
+ private string message;// 表示するメッセージ
154
+
155
+ [SerializeField]
156
+
157
+ private int maxTextLength = 400;// 1回のメッセージの最大文字数
158
+
159
+ private int textLength = 0;// 1回のメッセージの現在の文字数
160
+
161
+ [SerializeField]
162
+
163
+ private int maxLine = 3;// メッセージの最大行数
164
+
165
+ private int nowLine = 0;// 現在の行
166
+
167
+ [SerializeField]
168
+
169
+ private float textSpeed = 0.05f;// テキストスピード
170
+
171
+ private float elapsedTime = 0f;// 経過時間
172
+
173
+ private int nowTextNum = 0;// 今見ている文字番号
174
+
175
+ private Image clickIcon;// マウスクリックを促すアイコン
176
+
177
+ [SerializeField]
178
+
179
+ private float clickFlashTime = 0.2f;// クリックアイコンの点滅秒数
180
+
181
+ private bool isOneMessage = false;// 1回分のメッセージを表示したかどうか
182
+
183
+ private bool isEndMessage = false;// メッセージをすべて表示したかどうか
184
+
185
+ private string[] conversation;// 会話
186
+
187
+ private int i = 0;// 文字列の列
188
+
189
+ private int stringsCount = 0;// 文字列の総行数
190
+
191
+
192
+
193
+ void Start()
194
+
195
+ {
196
+
197
+ gameObject.SetActive(true);// このオブジェクトを表示する
198
+
199
+ clickIcon = canvas.transform.Find("Panel/Image").GetComponent<Image>();// clickIconをキャンバスの中のPanelの中のImageにする
200
+
201
+ clickIcon.enabled = false;// clickIconのコンポーネントをオフにする
202
+
203
+ messageText.text = "";// 文字を空白にする
204
+
205
+ }
206
+
207
+
208
+
209
+ void Update()
210
+
211
+ {
212
+
213
+ if (isEndMessage || message == null)// もし、メッセージが終わっていない、または設定されているなら
214
+
215
+ {
216
+
217
+ return;// 返す
218
+
219
+ }
220
+
221
+
222
+
223
+ if (!isOneMessage)// もし、1回に表示するメッセージを表示していなくて、
224
+
225
+ {
226
+
227
+ if (elapsedTime >= textSpeed)// テキスト表示時間が経過したら、
228
+
229
+ {
230
+
231
+ messageText.text += message[nowTextNum];// 次の文字番号にする
232
+
233
+
234
+
235
+ if (message[nowTextNum] == '\n')// もし、改行文字だったら
236
+
237
+ {
238
+
239
+ nowLine++;// 行数を足す
240
+
241
+ }
242
+
243
+
244
+
245
+ nowTextNum++;// 次の文字番号にする
246
+
247
+ textLength++;// 次の文字数にする
248
+
249
+ elapsedTime = 0f;// 経過時間を0にする
250
+
251
+
252
+
253
+ if (nowTextNum >= message.Length || textLength >= maxTextLength || nowLine >= maxLine)// もし、メッセージを全部表示、または行数が最大数表示されたなら、
254
+
255
+ {
256
+
257
+ isOneMessage = true;// isOneMessageをtrueにする
258
+
259
+ }
260
+
261
+ }
262
+
263
+
264
+
265
+ elapsedTime += Time.deltaTime;// 経過時間に時間の経過分足す
266
+
267
+
268
+
269
+ //ここから左クリックして一気に表示させる処理
270
+
271
+ if (Input.GetKeyDown(KeyCode.Return))// もし、メッセージ表示中に左クリックされたら、
272
+
273
+ {
274
+
275
+ var allText = messageText.text;// allTextに、文字を入れる
276
+
277
+
278
+
279
+ for (var i = nowTextNum; i < message.Length; i++)// 表示するメッセージ文繰り返す
280
+
281
+ {
282
+
283
+ allText += message[i];//allTextに表示するi番目のメッセージを足す
284
+
285
+
286
+
287
+ if (message[i] == '\n')// もし、改行文字だったら、
288
+
289
+ {
290
+
291
+ nowLine++;// 今の行に一行足す
292
+
293
+ }
294
+
295
+
296
+
297
+ nowTextNum++;// 次の文字番号にする
298
+
299
+ textLength++;// 次の文字数にする
300
+
301
+
302
+
303
+ if (nowTextNum >= message.Length || textLength >= maxTextLength || nowLine >= maxLine)// もし、メッセージがすべて表示される、または1回表示限度を超えたなら、
304
+
305
+ {
306
+
307
+ messageText.text = allText;// messageTextをallTextにする
308
+
309
+ isOneMessage = true;// isOneMessageをtrueにする
310
+
311
+ break;// 処理を止める
312
+
313
+ }
314
+
315
+ }
316
+
317
+ }
318
+
319
+ }
320
+
321
+
322
+
323
+ else// クリックされていなければ、
324
+
325
+ {
326
+
327
+ elapsedTime += Time.deltaTime;// 経過時間に時間の経過分足す
328
+
329
+
330
+
331
+ if (elapsedTime >= clickFlashTime)// クリックアイコンを点滅する時間を超えたなら、
332
+
333
+ {
334
+
335
+ clickIcon.enabled = !clickIcon.enabled;// クリックアイコンを点滅させる
336
+
337
+ elapsedTime = 0f;// 経過時間を0にする
338
+
339
+ }
340
+
341
+
342
+
343
+ // クリックされたら次の文字を表示する処理
344
+
345
+ if (Input.GetKeyDown(KeyCode.Return))// もし、クリックされたら、
346
+
347
+ {
348
+
349
+ messageText.text = "";// メッセージを空白にする
350
+
351
+ nowLine = 0;// 今の行を0にする
352
+
353
+ clickIcon.enabled = false;// クリックアイコンをオフにする
354
+
355
+ elapsedTime = 0f;// 経過時間を0にする
356
+
357
+ textLength = 0;// 文字数を0にする
358
+
359
+ isOneMessage = false;// isOneMessageを0にする
360
+
361
+
362
+
363
+ if (nowTextNum >= message.Length)// もし、メッセージが全部表示されていたら、
364
+
365
+ {
366
+
367
+ nowTextNum = 0;// 現在の文字番号を0にする
368
+
369
+
370
+
371
+ if (i == stringsCount - 1)// もし、文字列の総行数に達したら、
372
+
373
+ {
374
+
375
+ isEndMessage = true;// isEndMessageをtrueにする
376
+
377
+ canvas.transform.GetChild(0).gameObject.SetActive(false);// キャンバスの子オブジェクトを非表示にする
378
+
379
+ }
380
+
381
+
382
+
383
+ else// もし、文字列の総行数に達していなければ、
384
+
385
+ {
386
+
387
+ i++; //iを1増やす
388
+
389
+ SetMessage(conversation[i]);// SetMessageを実行する
390
+
391
+ }
392
+
393
+ }
394
+
395
+ }
396
+
397
+ }
398
+
399
+ }
400
+
401
+
402
+
403
+ void SetMessage(string message)// SetMessage
404
+
405
+ {
406
+
407
+ this.message = message;// このオブジェクトのmessageをmessageにする
408
+
409
+ }
410
+
411
+
412
+
413
+ public void SetMessagePanel(string[] message)// SetMessagePanel
414
+
415
+ {
416
+
417
+ i = 0;// iを0にする
418
+
419
+ stringsCount = message.Length;// 文字列の総行数をmessageの要素数にする
420
+
421
+ conversation = message;// coversationをmessageにする
422
+
423
+ canvas.SetActive(true);// キャンバスを表示する
424
+
425
+ SetMessage(conversation[0]);// SetMessageを実行する
426
+
427
+ canvas.transform.GetChild(1).gameObject.SetActive(true);// キャンバスの子オブジェクトを表示する
428
+
429
+ isEndMessage = false;// isEndMessageをfalseにする
430
+
431
+ }
432
+
433
+ }
434
+
435
+
436
+
437
+ ```

7

文法の修正

2022/01/09 06:51

投稿

AcrossKodez
AcrossKodez

スコア0

test CHANGED
File without changes
test CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  下記スクリプトは、
4
4
 
5
- プレイヤーが、フィールド内に立っているモブキャラクターに触れると吹き出しとセリフが表示される仕組みになっています(`OnCollisionEnter`)。
5
+ プレイヤーが、フィールド内に立っているモブキャラクターに触れると吹き出しとセリフが表示される仕組みになっています(コライダー同士の当たり判定によって会話が発生`OnCollisionEnter`)。
6
6
 
7
7
  **プレイヤーがモブに触れるたびに、吹き出しとセリフとが繰り返し表示されるようにコルーチンをループさせたい**
8
8
 

6

文法の修正

2022/01/08 19:39

投稿

AcrossKodez
AcrossKodez

スコア0

test CHANGED
@@ -1 +1 @@
1
- 【Unity3D】キャラの会話が一度しか実行されない
1
+ 【Unity3D】キャラの会話が一度しかできない
test CHANGED
File without changes

5

文法の修正

2022/01/08 19:37

投稿

AcrossKodez
AcrossKodez

スコア0

test CHANGED
File without changes
test CHANGED
@@ -1,4 +1,4 @@
1
- ###【要望】キャラに触れるたルーチンをループさせたい
1
+ ###【要望】キャラに触れたら会話発生→会話が終わ→キャラに触れらまた会話発生...のように、ループさせたい
2
2
 
3
3
  下記スクリプトは、
4
4
 

4

文法の修正

2022/01/08 19:36

投稿

AcrossKodez
AcrossKodez

スコア0

test CHANGED
@@ -1 +1 @@
1
- 【Unity3D】キャラの会話コルーチンが一度しか実行されない
1
+ 【Unity3D】キャラの会話が一度しか実行されない
test CHANGED
@@ -8,7 +8,9 @@
8
8
 
9
9
  のですが、
10
10
 
11
- 方法探しても見つないのでどなたか教えていただけないでしょうか?
11
+ 処理ループさせるには`void Update()`メソッドに何書かければいけないと思うのすが、
12
+
13
+ 思いつきません。
12
14
 
13
15
 
14
16
 
@@ -51,6 +53,16 @@
51
53
 
52
54
 
53
55
  void Start()
56
+
57
+ {
58
+
59
+
60
+
61
+ }
62
+
63
+
64
+
65
+ void Update()
54
66
 
55
67
  {
56
68
 

3

文法の修正

2022/01/08 19:33

投稿

AcrossKodez
AcrossKodez

スコア0

test CHANGED
File without changes
test CHANGED
@@ -12,7 +12,7 @@
12
12
 
13
13
 
14
14
 
15
- 現状、コルーチンは一度しか実行されず、2回目以降、モブに触れてもセリフが表示されません。
15
+ 現状、コルーチンは一度しか実行されず、2回目以降、モブに触れてもセリフと吹き出し一切表示されません。
16
16
 
17
17
 
18
18
 

2

文法の修正

2022/01/08 17:44

投稿

AcrossKodez
AcrossKodez

スコア0

test CHANGED
File without changes
test CHANGED
@@ -1,6 +1,6 @@
1
1
  ###【要望】キャラに触れるたび、コルーチンをループさせたい
2
2
 
3
- 下記コードは、
3
+ 下記スクリプトは、
4
4
 
5
5
  プレイヤーが、フィールド内に立っているモブキャラクターに触れると吹き出しとセリフが表示される仕組みになっています(`OnCollisionEnter`)。
6
6
 

1

文法の修正

2022/01/08 17:43

投稿

AcrossKodez
AcrossKodez

スコア0

test CHANGED
File without changes
test CHANGED
@@ -1,4 +1,4 @@
1
- ###【要望】オブジェクトに触れるたび、コルーチンをループさせたい
1
+ ###【要望】キャラに触れるたび、コルーチンをループさせたい
2
2
 
3
3
  下記コードは、
4
4