回答編集履歴

2

誤字の修正

2021/01/09 03:54

投稿

PinoMatcha
PinoMatcha

スコア368

test CHANGED
@@ -424,7 +424,7 @@
424
424
 
425
425
  // 大きさ変更
426
426
 
427
- counterText.transform.localScale = Vector3.one * currentSize; // 減算したfloatVector3.oneに掛ける
427
+ counterText.transform.localScale = Vector3.one * currentSize; // 減算したfloatVector3.oneに掛ける
428
428
 
429
429
 
430
430
 

1

追記

2021/01/09 03:54

投稿

PinoMatcha
PinoMatcha

スコア368

test CHANGED
@@ -29,3 +29,517 @@
29
29
 
30
30
 
31
31
  [アニメーションイベントの使用](https://docs.unity3d.com/ja/2018.4/Manual/animeditor-AnimationEvents.html)
32
+
33
+
34
+
35
+ ### 追記: カウントダウン処理
36
+
37
+ どうしてもプログラムで実装したいのであれば、仕方がありませんね…。
38
+
39
+
40
+
41
+ まず、繰り返しはforを使うといいと思います。
42
+
43
+ 指定回数ループさせるのにはちょうどいい処理です。
44
+
45
+ forの中で大きさ変更、フェードアウトなどの処理を実装しましょう。
46
+
47
+
48
+
49
+ ```C#
50
+
51
+ using System.Collections;
52
+
53
+ using System.Collections.Generic;
54
+
55
+ using UnityEngine;
56
+
57
+ using UnityEngine.UI;
58
+
59
+
60
+
61
+ public class CountdownCoroutine : MonoBehaviour
62
+
63
+ {
64
+
65
+ // レース開始の合図
66
+
67
+ // [SerializeField] private Text startCountNumber;
68
+
69
+ // private int orderNumbers = 3;
70
+
71
+
72
+
73
+ // 変数名変更しました。
74
+
75
+ [SerializeField] private Text counterText;
76
+
77
+ [SerializeField] private int startCount = 3;
78
+
79
+ [Space(5), Header("[ ! ] reduceTime + fadeTime + intervalTime = 1f になるように")]
80
+
81
+ [SerializeField, Range(0, 1)] private float reduceTime = 0.5f; // テキストの縮小に使う時間
82
+
83
+ [SerializeField, Range(0, 1)] private float fadeTime = 0.4f; // テキストのフェードアウトに使う時間
84
+
85
+ [SerializeField, Range(0, 1)] private float intervalTime = 0.1f; // 次のカウントに行くまでの待ち時間
86
+
87
+
88
+
89
+ /// <summary>
90
+
91
+ /// reduceTime、fadeTime、intervalTimeについて
92
+
93
+ ///
94
+
95
+ /// 処理の基本としては、
96
+
97
+ /// 1. テキストの大きさを縮小
98
+
99
+ /// 2. テキストをフェードアウト
100
+
101
+ /// 3. 少し待つ
102
+
103
+ /// の繰り返しです。
104
+
105
+ ///
106
+
107
+ /// なので、reduceTime、fadeTime、intervalTimeをすべて足して1になるようにしないと
108
+
109
+ /// カウントダウンが1秒ごとにならないので気を付けてください。
110
+
111
+ /// </summary>
112
+
113
+
114
+
115
+ void Start() {
116
+
117
+ // ↑せっかく変数を用意しているので、わざわざ引数を使う必要はない
118
+
119
+ StartCoroutine("StartCountThreeTime");
120
+
121
+ }
122
+
123
+
124
+
125
+ /// <summary>
126
+
127
+ /// レース開始の時間を三つ数える
128
+
129
+ /// </summary>
130
+
131
+ /* private IEnumerator StartCountThreeTime(Text numberText, int displayNumbers) {
132
+
133
+ if (numberText == null) {// null ならばコルーチンを抜ける
134
+
135
+
136
+
137
+ yield break;
138
+
139
+ }
140
+
141
+
142
+
143
+ // 表示する文字
144
+
145
+ numberText.text = displayNumbers.ToString();
146
+
147
+
148
+
149
+ // 大小サイズを決めておく
150
+
151
+ Vector3 initialSize = new Vector3(20, 20, 20);
152
+
153
+ Vector3 minimumSize = new Vector3(2, 2, 2);
154
+
155
+
156
+
157
+ var time = 0f; // 時間を数える
158
+
159
+ var countTime = 1; // 時間を指定
160
+
161
+ var size = 0f; // テキストのサイズ
162
+
163
+ var speed = 0.07f; // テキストの縮小スピード
164
+
165
+
166
+
167
+
168
+
169
+ numberText.enabled = true;
170
+
171
+
172
+
173
+ // 文字を小さくする
174
+
175
+ while (time <= countTime) {
176
+
177
+
178
+
179
+ time += Time.deltaTime;
180
+
181
+ numberText.transform.localScale = Vector3.Lerp(initialSize, minimumSize, size);
182
+
183
+ size += speed;
184
+
185
+
186
+
187
+ yield return null;
188
+
189
+ }
190
+
191
+
192
+
193
+ // 一応最小値をいれておく
194
+
195
+ numberText.transform.localScale = minimumSize;
196
+
197
+
198
+
199
+ var alpha = 1f; // α値を設定
200
+
201
+
202
+
203
+ // 文字が小さくなったならば、ゆっくり消える
204
+
205
+ if (numberText.transform.localScale == minimumSize) {
206
+
207
+ while (alpha >= 0) {// α値を減らす
208
+
209
+
210
+
211
+ alpha -= Time.deltaTime;
212
+
213
+ numberText.color = new Color(numberText.color.r, numberText.color.g, numberText.color.b, alpha);
214
+
215
+
216
+
217
+ yield return null;
218
+
219
+ }
220
+
221
+ }
222
+
223
+
224
+
225
+ // 終わったら非表示
226
+
227
+ numberText.enabled = false;
228
+
229
+
230
+
231
+ // α値を戻す
232
+
233
+ alpha = 1;
234
+
235
+
236
+
237
+ // 次の文字へ
238
+
239
+ orderNumbers--;
240
+
241
+
242
+
243
+ // 2,3を表示
244
+
245
+ switch (orderNumbers) {
246
+
247
+
248
+
249
+ case 2:
250
+
251
+ StartCoroutine(StartCountThreeTime(numberText, orderNumbers));
252
+
253
+ break;
254
+
255
+
256
+
257
+ case 1:
258
+
259
+ StartCoroutine(StartCountThreeTime(numberText, orderNumbers));
260
+
261
+ break;
262
+
263
+ }
264
+
265
+
266
+
267
+ // コルーチンを抜ける
268
+
269
+ yield break;
270
+
271
+
272
+
273
+
274
+
275
+
276
+
277
+ // 表示が終わったら、何かでAIとPlayerに知らせて、動くようにする
278
+
279
+
280
+
281
+ }*/
282
+
283
+
284
+
285
+ private IEnumerator StartCountThreeTime() {
286
+
287
+ if (counterText == null) {// null ならばコルーチンを抜ける
288
+
289
+ yield break;
290
+
291
+ // エラーを想定できていていいと思います。
292
+
293
+ }
294
+
295
+
296
+
297
+ Debug.Log("カウントダウン開始");
298
+
299
+
300
+
301
+ counterText.enabled = true;
302
+
303
+
304
+
305
+ // startCount分繰り返す
306
+
307
+ // startCountの大きさから1ずつ引いていくforで繰り返し
308
+
309
+ for (var currentCount = startCount; currentCount > 0; currentCount--) {
310
+
311
+
312
+
313
+ // テキスト表示を更新
314
+
315
+ counterText.text = currentCount.ToString();
316
+
317
+
318
+
319
+ // 2回目のカウント以降、アルファ値が変更後そのままなので大きさを変更する前にアルファ値もリセットしておく
320
+
321
+ counterText.color = new Color(counterText.color.r, counterText.color.g, counterText.color.b, 1.0f);
322
+
323
+
324
+
325
+ // 大きさ変更のコルーチン
326
+
327
+ // yield return StartCoroutine()を使うことで、コルーチン処理が終わるまで待機できる
328
+
329
+ yield return StartCoroutine("ReduceInSize");
330
+
331
+
332
+
333
+ // フェードアウトのコルーチン
334
+
335
+ yield return StartCoroutine("FadeOut");
336
+
337
+
338
+
339
+ // 少しの間待待たないとすぐに次のカウントにいってしまい違和感がある
340
+
341
+ yield return new WaitForSecondsRealtime(intervalTime);
342
+
343
+ }
344
+
345
+
346
+
347
+ Debug.Log("カウントダウン終了");
348
+
349
+
350
+
351
+ // ここでレースのスタート処理
352
+
353
+ Debug.Log("Go!");
354
+
355
+
356
+
357
+ // 終わったら非表示
358
+
359
+ numberText.enabled = false;
360
+
361
+
362
+
363
+ // コルーチンを抜ける
364
+
365
+ yield break;
366
+
367
+ }
368
+
369
+
370
+
371
+ private IEnumerator ReduceInSize() {
372
+
373
+ Debug.Log("大きさ変更開始");
374
+
375
+
376
+
377
+ // 大小サイズを決めておく
378
+
379
+ // x, y, z がすべて一緒なのでfloat管理でいいと思います
380
+
381
+ // Vector3 initialSize = new Vector3(20, 20, 20);
382
+
383
+ // Vector3 minimumSize = new Vector3(2, 2, 2);
384
+
385
+ float initialSize = 20;
386
+
387
+ float minimumSize = 2;
388
+
389
+
390
+
391
+ // 初期の大きさに設定
392
+
393
+ // Vector3.one に floatをかけて大きさを調整
394
+
395
+ counterText.transform.localScale = Vector3.one * initialSize;
396
+
397
+
398
+
399
+ // テキストのサイズ調整用
400
+
401
+ // このcurrentSizeを変動させて大きさを調整
402
+
403
+ float currentSize = initialSize;
404
+
405
+
406
+
407
+ // reduceTimeを直接いじると変数の値自体が変わってしまうので一時的に変数に格納
408
+
409
+ float tmpReduceTime = reduceTime;
410
+
411
+ // 文字を小さくする
412
+
413
+ while (currentSize > minimumSize) {
414
+
415
+ tmpReduceTime -= Time.deltaTime; // 時間更新(徐々に減らす)
416
+
417
+ currentSize = tmpReduceTime / reduceTime; // 徐々に0に近づける
418
+
419
+ currentSize *= initialSize; // 上の二行の処理では、currentSizeが1→0になってしまうのでinitialSize(最大値)を掛ける
420
+
421
+ currentSize = Mathf.Clamp(currentSize, minimumSize, initialSize); //clamp
422
+
423
+
424
+
425
+ // 大きさ変更
426
+
427
+ counterText.transform.localScale = Vector3.one * currentSize; // 減算したfloatにVector3.oneに掛ける
428
+
429
+
430
+
431
+ yield return null;
432
+
433
+ }
434
+
435
+
436
+
437
+ // 一応最小値をいれておく
438
+
439
+ counterText.transform.localScale = Vector3.one * minimumSize;
440
+
441
+
442
+
443
+ yield break;
444
+
445
+ }
446
+
447
+
448
+
449
+ private IEnumerator FadeOut() {
450
+
451
+ Debug.Log("フェードアウト開始");
452
+
453
+
454
+
455
+ var alpha = 1f; // α値を設定
456
+
457
+
458
+
459
+ // fadeTimeを直接いじる訳にはいかないので一時的に変数に格納
460
+
461
+ float tmpFadeTime = fadeTime;
462
+
463
+
464
+
465
+ // フェードアウト
466
+
467
+ // α値を減らす
468
+
469
+ while (alpha >= 0) {
470
+
471
+ tmpFadeTime -= Time.deltaTime;
472
+
473
+ alpha = tmpFadeTime / fadeTime;
474
+
475
+
476
+
477
+ // アルファ値変更
478
+
479
+ Color col = counterText.color;
480
+
481
+ col.a = alpha;
482
+
483
+ counterText.color = col;
484
+
485
+
486
+
487
+ yield return null;
488
+
489
+ }
490
+
491
+
492
+
493
+ yield break;
494
+
495
+ }
496
+
497
+ }
498
+
499
+ ```
500
+
501
+ ### 余談: Time.deltaTimeの使いどころ
502
+
503
+ パッとコードを見た感じ、Time.deltaTimeを使っていないように見えます。
504
+
505
+ unityのTime.deltaTimeはハードのスペック差を埋める大切なものです。
506
+
507
+
508
+
509
+ 例えば、1秒間に120回ゲームを更新できるハイスペックPCと、1秒間に10回しかゲームを更新できないロースペックPCがあるとします。
510
+
511
+ その2台のPCで以下の処理を行うとします。
512
+
513
+ ```C#
514
+
515
+ void Update () {
516
+
517
+ transform.position += Vector3.up;
518
+
519
+ }
520
+
521
+ ```
522
+
523
+ ハイスペックPCだとUpdate()が1秒間に120回呼ばれますが、ロースペックPCだとUpdate()は1秒間に10回しか呼ばれません…。
524
+
525
+ そうなると、実行結果にスペック差によるズレが生じてしまいます。
526
+
527
+ これを埋めるために、
528
+
529
+ ```C#
530
+
531
+ void Update () {
532
+
533
+ transform.position += Vector3.up * Time.deltaTime;
534
+
535
+ }
536
+
537
+ ```
538
+
539
+ というようにしてスペック差によるズレを抑えています。
540
+
541
+ なので、簡潔に言うと、スペック差でズレて欲しくないものにはTime.deltaTimeを掛けると良いかもしれません。
542
+
543
+
544
+
545
+ まぁ、詳細は調べていただいて…。