質問編集履歴

11

追記⑧

2021/02/10 18:52

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -128,78 +128,28 @@
128
128
 
129
129
  ### 追記
130
130
 
131
-
132
-
133
- ・t-length
131
+ length - Mathf.Repeat(t, length * 2.0f)
134
-
132
+
135
- ```C#
133
+ ```C#
136
-
134
+
137
- int length = 3;
135
+ int length = 3;
138
-
136
+
139
- for (int t=0; t<13; t++){
137
+ for (int t=0; t<13; t++){
140
-
138
+
141
- Debug.Log($"Mathf.PingPong({t},{length}):{Mathf.PingPong(t,length)}, t-length:{t-length}");
139
+ Debug.Log($"Mathf.PingPong({t},{length}):{Mathf.PingPong(t,length)},
140
+
142
-
141
+ length - Mathf.Repeat(t, length * 2.0f):{length - Mathf.Repeat(t, length * 2.0f)}");
142
+
143
- }
143
+ }
144
-
144
+
145
- ```
145
+ ```
146
+
147
+
146
148
 
147
149
  出力結果。
148
150
 
149
151
  ```
150
152
 
151
- Mathf.PingPong(0,3):0, t-length:-3
152
-
153
- Mathf.PingPong(1,3):1, t-length:-2
154
-
155
- Mathf.PingPong(2,3):2, t-length:-1
156
-
157
- Mathf.PingPong(3,3):3, t-length:0
158
-
159
- Mathf.PingPong(4,3):2, t-length:1
160
-
161
- Mathf.PingPong(5,3):1, t-length:2
162
-
163
- Mathf.PingPong(6,3):0, t-length:3
164
-
165
- Mathf.PingPong(7,3):1, t-length:4
166
-
167
- Mathf.PingPong(8,3):2, t-length:5
168
-
169
- Mathf.PingPong(9,3):3, t-length:6
170
-
171
- Mathf.PingPong(10,3):2, t-length:7
172
-
173
- Mathf.PingPong(11,3):1, t-length:8
174
-
175
- Mathf.PingPong(12,3):0, t-length:9
176
-
177
- ```
178
-
179
-
180
-
181
- ・length - Mathf.Repeat(t, length * 2.0f)
182
-
183
- ```C#
184
-
185
- int length = 3;
186
-
187
- for (int t=0; t<13; t++){
188
-
189
- Debug.Log($"Mathf.PingPong({t},{length}):{Mathf.PingPong(t,length)},
190
-
191
- length - Mathf.Repeat(t, length * 2.0f):{length - Mathf.Repeat(t, length * 2.0f)}");
192
-
193
- }
194
-
195
- ```
196
-
197
-
198
-
199
- 出力結果。
200
-
201
- ```
202
-
203
153
  Mathf.PingPong(0,3):0, length - Mathf.Repeat(t, length * 2.0f):3
204
154
 
205
155
  Mathf.PingPong(1,3):1, length - Mathf.Repeat(t, length * 2.0f):2
@@ -218,14 +168,6 @@
218
168
 
219
169
  Mathf.PingPong(8,3):2, length - Mathf.Repeat(t, length * 2.0f):1
220
170
 
221
- Mathf.PingPong(9,3):3, length - Mathf.Repeat(t, length * 2.0f):0
222
-
223
- Mathf.PingPong(10,3):2, length - Mathf.Repeat(t, length * 2.0f):-1
224
-
225
- Mathf.PingPong(11,3):1, length - Mathf.Repeat(t, length * 2.0f):-2
226
-
227
- Mathf.PingPong(12,3):0, length - Mathf.Repeat(t, length * 2.0f):3
228
-
229
171
  ```
230
172
 
231
173
 
@@ -340,298 +282,374 @@
340
282
 
341
283
 
342
284
 
285
+ void Update(){
286
+
287
+ if (Input.GetMouseButtonDown(0)){
288
+
289
+ // TimetimeCoroutineが動いていたら何もしないという処理を可能であれば書きたい
290
+
291
+ startTime = Time.time;
292
+
293
+ StartCoroutine(TimeCoroutine(startTime));
294
+
295
+ }else if(Input.GetMouseButtonDown(1)){
296
+
297
+ Suspension(TimeCoroutine, DoSomethingCoroutine);
298
+
299
+ }
300
+
301
+ }
302
+
303
+
304
+
305
+ // Time.timeを使ったコルーチン
306
+
307
+ // 今回はPingPongの処理に該当。コードが長くなり、他でエラーが発生しているため、暫定的な内容となりました。
308
+
309
+ IEnumerator TimeCoroutine(float startTime){
310
+
311
+ float t = (Time.time - startTime) * speed;
312
+
313
+ while(true){
314
+
315
+ Debug.Log("$TimeCoroutine:{t}");
316
+
317
+ }
318
+
319
+ }
320
+
321
+
322
+
323
+ IEnumerator DoSomethingCoroutine(float animationLength){
324
+
325
+ for (float time = 0.0f; time < animationLength; time += Time.deltaTime)
326
+
327
+ {
328
+
329
+ float t = time / this.animationLength;
330
+
331
+ // 補間値tを使った何かしらの処理
332
+
333
+ Debug.Log($"t:{t}");
334
+
335
+ yield return null;
336
+
337
+ }
338
+
339
+ // 補間値t=1の調整処理
340
+
341
+ Debug.Log("t:1");
342
+
343
+ }
344
+
345
+
346
+
347
+ void Suspension(Coroutine TimeCoroutine, Coroutine SuspensionCoroutine){
348
+
349
+ // 第1引数のTimetimeCoroutineが動いていなければ何もしない
350
+
351
+ // if文で判定してreturn
352
+
353
+ // ...というような処理を組みたいと思ったのですが、コルーチンの生存確認をする方法が
354
+
355
+ // 見つかりませんでした。
356
+
357
+ // フィールドにフラグを持たせて、TimetimeCoroutine内で切り替えるという手法以外にありますか?
358
+
359
+ StopCoroutine(TimeCoroutine(0f));
360
+
361
+ Debug.Log("中断");
362
+
363
+ float pauseTime = Time.time;
364
+
365
+ yield return SuspensionCoroutine();
366
+
367
+ startTime += Time.time - pauseTime;
368
+
369
+ StartCoroutine(TimeCoroutine(startTime));
370
+
371
+ Debug.Log("再開");
372
+
373
+ }
374
+
375
+ ```
376
+
377
+
378
+
379
+ ### 追記⑥
380
+
381
+
382
+
383
+ ```C#
384
+
385
+ public class MyTime : MonoBehaviour
386
+
387
+ {
388
+
389
+ private static bool m_isActive = false;
390
+
391
+ private static float m_time;
392
+
393
+ private static float m_timeScale = 1.0f;
394
+
395
+ private static IEnumerator mytimeCoroutine;
396
+
397
+ public static float time{
398
+
399
+ get { return m_time; }
400
+
401
+ }
402
+
403
+ public static bool isActive{
404
+
405
+ get { return m_isActive; }
406
+
407
+ }
408
+
409
+
410
+
411
+ public static float timeSale{
412
+
413
+ get { return m_timeScale; }
414
+
415
+ set {
416
+
417
+ if (m_timeScale == 0 && m_isActive){
418
+
419
+ StopCoroutine(mytimeCoroutine);
420
+
421
+ m_timeScale = 0;
422
+
423
+ }else{
424
+
425
+ m_timeScale = value;
426
+
427
+ }
428
+
429
+ }
430
+
431
+ }
432
+
433
+
434
+
435
+ private static IEnumerator TimeCoroutine(){
436
+
437
+ // 本当はメソッドのようにreturnで処理を中止したかったのですが、できませんか?
438
+
439
+ // if (m_isActive) return;
440
+
441
+ if(!m_isActive){
442
+
443
+ m_isActive = true;
444
+
445
+ while(true){
446
+
447
+ m_time += Time.deltaTime;
448
+
449
+ m_time *= m_timeScale;
450
+
451
+ yield return null;
452
+
453
+ }
454
+
455
+ }
456
+
457
+ }
458
+
459
+
460
+
461
+ public static void StartTime(){
462
+
463
+ StartCoroutine(TimeCoroutine());
464
+
465
+ }
466
+
467
+
468
+
469
+ public static void StopTime(){
470
+
471
+ if (!m_isActive) return;
472
+
473
+ m_isActive = false;
474
+
475
+ StopCoroutine(mytimeCoroutine);
476
+
477
+ }
478
+
479
+
480
+
481
+ public static void RestartTime(){
482
+
483
+ if (mytimeCoroutine == null) return;
484
+
485
+ StartCoroutine(mytimeCoroutine);
486
+
487
+ }
488
+
489
+
490
+
491
+ public static void ClearTime(){
492
+
493
+ StopTime();
494
+
495
+ mytimeCoroutine = null;
496
+
497
+ m_time = 0;
498
+
499
+ }
500
+
501
+ }
502
+
503
+ ```
504
+
505
+ ### 追記⑦
506
+
507
+
508
+
509
+ ```C#
510
+
511
+ public class TestCoroutine : MonoBehaviour
512
+
513
+ {
514
+
515
+
516
+
517
+ UnityEngine.Coroutine RunningMyCoroutine;
518
+
519
+
520
+
343
521
  void Start()
344
522
 
345
523
  {
346
524
 
347
-
348
-
349
- }
350
-
351
-
352
-
353
-
354
-
355
- void Update(){
356
-
357
- if (Input.GetMouseButtonDown(0)){
358
-
359
- // TimetimeCoroutineが動いていたら何もしないという処理を可能であれば書きたい
360
-
361
- startTime = Time.time;
362
-
363
- StartCoroutine(TimeCoroutine(startTime));
364
-
365
- }else if(Input.GetMouseButtonDown(1)){
366
-
367
- Suspension(TimeCoroutine, DoSomethingCoroutine);
368
-
369
- }
370
-
371
- }
372
-
373
-
374
-
375
- // Time.timeを使ったコルーチン
376
-
377
- // 今回はPingPongの処理に該当。コードが長くなり、他でエラーが発生しているため、暫定的な内容となりました。
378
-
379
- IEnumerator TimeCoroutine(float startTime){
380
-
381
- float t = (Time.time - startTime) * speed;
382
-
383
- while(true){
384
-
385
- Debug.Log("$TimeCoroutine:{t}");
386
-
387
- }
388
-
389
- }
390
-
391
-
392
-
393
- IEnumerator DoSomethingCoroutine(float animationLength){
394
-
395
- for (float time = 0.0f; time < animationLength; time += Time.deltaTime)
525
+ RunningMyCoroutine = StartCoroutine(MyCoroutine());
526
+
527
+ }
528
+
529
+
530
+
531
+ void Update()
532
+
533
+ {
534
+
535
+ if(Input.GetMouseButtonDown(0)){
536
+
537
+ RunningMyCoroutine = StartCoroutine(MyCoroutine());
538
+
539
+ }
540
+
541
+ }
542
+
543
+
544
+
545
+ IEnumerator MyCoroutine(){
546
+
547
+ if (RunningMyCoroutine != null) yield break;
548
+
549
+ int i = 0;
550
+
551
+ while(i<5){
552
+
553
+ Debug.Log($"MyCoroutine:{i}");
554
+
555
+ i++;
556
+
557
+ yield return new WaitForSeconds(2.0f);
558
+
559
+ }
560
+
561
+ RunningMyCoroutine = null;
562
+
563
+ }
564
+
565
+ }
566
+
567
+ ```
568
+
569
+ ### 追記⑧
570
+
571
+
572
+
573
+ ```C#
574
+
575
+ [SerializeField] GameObject startPoint;
576
+
577
+ [SerializeField] GameObject endPoint;
578
+
579
+ [SerializeField] float animationLength = 1.0f;
580
+
581
+
582
+
583
+ readonly float speed = 4;
584
+
585
+
586
+
587
+ void Start()
588
+
589
+ {
590
+
591
+ Vector3 startPosition = startPoint.transform.position;
592
+
593
+ Vector3 endPosition = endPoint.transform.position;
594
+
595
+ startPosition.y = 0.0f;
596
+
597
+ endPosition.y = 0.0f;
598
+
599
+ StartCoroutine(Move(this.transform, endPosition));
600
+
601
+ }
602
+
603
+
604
+
605
+ IEnumerator Move(Transform trf, Vector3 toPosition)
606
+
607
+ {
608
+
609
+ WaitForInterruption interrupter = new WaitForInterruption();
610
+
611
+ while (true)
396
612
 
397
613
  {
398
614
 
399
- float t = time / this.animationLength;
400
-
401
- // 補間値tを使った何かしらの処理
402
-
403
- Debug.Log($"t:{t}");
404
-
405
- yield return null;
406
-
407
- }
408
-
409
- // 補間値t=1の調整処理
410
-
411
- Debug.Log("t:1");
412
-
413
- }
414
-
415
-
416
-
417
- void Suspension(Coroutine TimeCoroutine, Coroutine SuspensionCoroutine){
418
-
419
- // 第1引数のTimetimeCoroutineが動いていなければ何もしない
420
-
421
- // if文で判定してreturn
422
-
423
- // ...というような処理を組みたいと思ったのですが、コルーチンの生存確認をする方法が
424
-
425
- // 見つかりませんでした。
426
-
427
- // フィールドにフラグを持たせて、TimetimeCoroutine内で切り替えるという手法以外にありますか?
428
-
429
- StopCoroutine(TimeCoroutine(0f));
430
-
431
- Debug.Log("中断");
432
-
433
- float pauseTime = Time.time;
434
-
435
- yield return SuspensionCoroutine();
615
+ Vector3 currentPosition = trf.position;
436
-
616
+
437
- startTime += Time.time - pauseTime;
617
+ Vector3 nextPosition = Vector3.MoveTowards(currentPosition, toPosition, speed * Time.deltaTime);
438
-
618
+
439
- StartCoroutine(TimeCoroutine(startTime));
619
+ if (currentPosition == nextPosition)
440
-
441
- Debug.Log("再開");
620
+
442
-
443
- }
444
-
445
- ```
446
-
447
-
448
-
449
- ### 追記⑥
450
-
451
-
452
-
453
- ```C#
454
-
455
- public class MyTime : MonoBehaviour
456
-
457
- {
621
+ {
458
-
459
- private static bool m_isActive = false;
622
+
460
-
461
- private static float m_time;
462
-
463
- private static float m_timeScale = 1.0f;
464
-
465
- private static IEnumerator mytimeCoroutine;
466
-
467
- public static float time{
468
-
469
- get { return m_time; }
470
-
471
- }
472
-
473
- public static bool isActive{
474
-
475
- get { return m_isActive; }
476
-
477
- }
478
-
479
-
480
-
481
- public static float timeSale{
482
-
483
- get { return m_timeScale; }
484
-
485
- set {
623
+ break;
486
-
487
- if (m_timeScale == 0 && m_isActive){
488
-
489
- StopCoroutine(mytimeCoroutine);
490
-
491
- m_timeScale = 0;
492
-
493
- }else{
494
-
495
- m_timeScale = value;
496
624
 
497
625
  }
498
626
 
627
+ trf.position = nextPosition;
628
+
629
+ // yield return new WaitUntil(()=>true);
630
+
631
+ // yield return new WaitWhile(()=>false);
632
+
633
+ // yield return false;
634
+
635
+ // yield return true;
636
+
637
+ yield return interrupter;
638
+
499
- }
639
+ }
500
-
640
+
501
- }
641
+ }
502
-
503
-
504
-
505
- private static IEnumerator TimeCoroutine(){
642
+
506
-
507
- // 本当はメソッドのようにreturnで処理を中止したかったのですが、できませんか?
643
+
508
-
509
- // if (m_isActive) return;
644
+
510
-
511
- if(!m_isActive){
512
-
513
- m_isActive = true;
514
-
515
- while(true){
516
-
517
- m_time += Time.deltaTime;
518
-
519
- m_time *= m_timeScale;
520
-
521
- yield return null;
522
-
523
- }
524
-
525
- }
526
-
527
- }
528
-
529
-
530
-
531
- public static void StartTime(){
532
-
533
- StartCoroutine(TimeCoroutine());
534
-
535
- }
536
-
537
-
538
-
539
- public static void StopTime(){
540
-
541
- if (!m_isActive) return;
542
-
543
- m_isActive = false;
544
-
545
- StopCoroutine(mytimeCoroutine);
546
-
547
- }
548
-
549
-
550
-
551
- public static void RestartTime(){
552
-
553
- if (mytimeCoroutine == null) return;
554
-
555
- StartCoroutine(mytimeCoroutine);
556
-
557
- }
558
-
559
-
560
-
561
- public static void ClearTime(){
562
-
563
- StopTime();
564
-
565
- mytimeCoroutine = null;
566
-
567
- m_time = 0;
568
-
569
- }
570
-
571
- }
572
-
573
- ```
574
-
575
- ### 追記⑦
576
-
577
-
578
-
579
- ```C#
580
-
581
- public class TestCoroutine : MonoBehaviour
645
+ class WaitForInterruption : CustomYieldInstruction
582
-
583
- {
584
-
585
-
586
-
587
- UnityEngine.Coroutine RunningMyCoroutine;
588
-
589
-
590
-
591
- void Start()
592
646
 
593
647
  {
594
648
 
649
+ // public override bool keepWaiting => this.runningCoroutineCount > 0;
650
+
595
- RunningMyCoroutine = StartCoroutine(MyCoroutine());
651
+ public override bool keepWaiting => false;
596
-
652
+
597
- }
653
+ }
598
-
599
-
600
-
601
- void Update()
654
+
602
-
603
- {
604
-
605
- if(Input.GetMouseButtonDown(0)){
606
-
607
- RunningMyCoroutine = StartCoroutine(MyCoroutine());
608
-
609
- }
610
-
611
- }
612
-
613
-
614
-
615
- IEnumerator MyCoroutine(){
616
-
617
- if (RunningMyCoroutine != null) yield break;
618
-
619
- int i = 0;
620
-
621
- while(i<5){
622
-
623
- Debug.Log($"MyCoroutine:{i}");
624
-
625
- i++;
626
-
627
- yield return new WaitForSeconds(2.0f);
628
-
629
- }
630
-
631
- RunningMyCoroutine = null;
632
-
633
- }
634
-
635
- }
636
-
637
- ```
655
+ ```

10

追記⑦追記

2021/02/10 18:52

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -571,3 +571,67 @@
571
571
  }
572
572
 
573
573
  ```
574
+
575
+ ### 追記⑦
576
+
577
+
578
+
579
+ ```C#
580
+
581
+ public class TestCoroutine : MonoBehaviour
582
+
583
+ {
584
+
585
+
586
+
587
+ UnityEngine.Coroutine RunningMyCoroutine;
588
+
589
+
590
+
591
+ void Start()
592
+
593
+ {
594
+
595
+ RunningMyCoroutine = StartCoroutine(MyCoroutine());
596
+
597
+ }
598
+
599
+
600
+
601
+ void Update()
602
+
603
+ {
604
+
605
+ if(Input.GetMouseButtonDown(0)){
606
+
607
+ RunningMyCoroutine = StartCoroutine(MyCoroutine());
608
+
609
+ }
610
+
611
+ }
612
+
613
+
614
+
615
+ IEnumerator MyCoroutine(){
616
+
617
+ if (RunningMyCoroutine != null) yield break;
618
+
619
+ int i = 0;
620
+
621
+ while(i<5){
622
+
623
+ Debug.Log($"MyCoroutine:{i}");
624
+
625
+ i++;
626
+
627
+ yield return new WaitForSeconds(2.0f);
628
+
629
+ }
630
+
631
+ RunningMyCoroutine = null;
632
+
633
+ }
634
+
635
+ }
636
+
637
+ ```

9

追記⑥

2021/02/09 16:51

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -443,3 +443,131 @@
443
443
  }
444
444
 
445
445
  ```
446
+
447
+
448
+
449
+ ### 追記⑥
450
+
451
+
452
+
453
+ ```C#
454
+
455
+ public class MyTime : MonoBehaviour
456
+
457
+ {
458
+
459
+ private static bool m_isActive = false;
460
+
461
+ private static float m_time;
462
+
463
+ private static float m_timeScale = 1.0f;
464
+
465
+ private static IEnumerator mytimeCoroutine;
466
+
467
+ public static float time{
468
+
469
+ get { return m_time; }
470
+
471
+ }
472
+
473
+ public static bool isActive{
474
+
475
+ get { return m_isActive; }
476
+
477
+ }
478
+
479
+
480
+
481
+ public static float timeSale{
482
+
483
+ get { return m_timeScale; }
484
+
485
+ set {
486
+
487
+ if (m_timeScale == 0 && m_isActive){
488
+
489
+ StopCoroutine(mytimeCoroutine);
490
+
491
+ m_timeScale = 0;
492
+
493
+ }else{
494
+
495
+ m_timeScale = value;
496
+
497
+ }
498
+
499
+ }
500
+
501
+ }
502
+
503
+
504
+
505
+ private static IEnumerator TimeCoroutine(){
506
+
507
+ // 本当はメソッドのようにreturnで処理を中止したかったのですが、できませんか?
508
+
509
+ // if (m_isActive) return;
510
+
511
+ if(!m_isActive){
512
+
513
+ m_isActive = true;
514
+
515
+ while(true){
516
+
517
+ m_time += Time.deltaTime;
518
+
519
+ m_time *= m_timeScale;
520
+
521
+ yield return null;
522
+
523
+ }
524
+
525
+ }
526
+
527
+ }
528
+
529
+
530
+
531
+ public static void StartTime(){
532
+
533
+ StartCoroutine(TimeCoroutine());
534
+
535
+ }
536
+
537
+
538
+
539
+ public static void StopTime(){
540
+
541
+ if (!m_isActive) return;
542
+
543
+ m_isActive = false;
544
+
545
+ StopCoroutine(mytimeCoroutine);
546
+
547
+ }
548
+
549
+
550
+
551
+ public static void RestartTime(){
552
+
553
+ if (mytimeCoroutine == null) return;
554
+
555
+ StartCoroutine(mytimeCoroutine);
556
+
557
+ }
558
+
559
+
560
+
561
+ public static void ClearTime(){
562
+
563
+ StopTime();
564
+
565
+ mytimeCoroutine = null;
566
+
567
+ m_time = 0;
568
+
569
+ }
570
+
571
+ }
572
+
573
+ ```

8

追記⑤

2021/02/05 15:37

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -325,3 +325,121 @@
325
325
  }
326
326
 
327
327
  ```
328
+
329
+
330
+
331
+ ### 追記⑤
332
+
333
+
334
+
335
+ ```C#
336
+
337
+ float startTime;
338
+
339
+ float speed = 2.0f;
340
+
341
+
342
+
343
+ void Start()
344
+
345
+ {
346
+
347
+
348
+
349
+ }
350
+
351
+
352
+
353
+
354
+
355
+ void Update(){
356
+
357
+ if (Input.GetMouseButtonDown(0)){
358
+
359
+ // TimetimeCoroutineが動いていたら何もしないという処理を可能であれば書きたい
360
+
361
+ startTime = Time.time;
362
+
363
+ StartCoroutine(TimeCoroutine(startTime));
364
+
365
+ }else if(Input.GetMouseButtonDown(1)){
366
+
367
+ Suspension(TimeCoroutine, DoSomethingCoroutine);
368
+
369
+ }
370
+
371
+ }
372
+
373
+
374
+
375
+ // Time.timeを使ったコルーチン
376
+
377
+ // 今回はPingPongの処理に該当。コードが長くなり、他でエラーが発生しているため、暫定的な内容となりました。
378
+
379
+ IEnumerator TimeCoroutine(float startTime){
380
+
381
+ float t = (Time.time - startTime) * speed;
382
+
383
+ while(true){
384
+
385
+ Debug.Log("$TimeCoroutine:{t}");
386
+
387
+ }
388
+
389
+ }
390
+
391
+
392
+
393
+ IEnumerator DoSomethingCoroutine(float animationLength){
394
+
395
+ for (float time = 0.0f; time < animationLength; time += Time.deltaTime)
396
+
397
+ {
398
+
399
+ float t = time / this.animationLength;
400
+
401
+ // 補間値tを使った何かしらの処理
402
+
403
+ Debug.Log($"t:{t}");
404
+
405
+ yield return null;
406
+
407
+ }
408
+
409
+ // 補間値t=1の調整処理
410
+
411
+ Debug.Log("t:1");
412
+
413
+ }
414
+
415
+
416
+
417
+ void Suspension(Coroutine TimeCoroutine, Coroutine SuspensionCoroutine){
418
+
419
+ // 第1引数のTimetimeCoroutineが動いていなければ何もしない
420
+
421
+ // if文で判定してreturn
422
+
423
+ // ...というような処理を組みたいと思ったのですが、コルーチンの生存確認をする方法が
424
+
425
+ // 見つかりませんでした。
426
+
427
+ // フィールドにフラグを持たせて、TimetimeCoroutine内で切り替えるという手法以外にありますか?
428
+
429
+ StopCoroutine(TimeCoroutine(0f));
430
+
431
+ Debug.Log("中断");
432
+
433
+ float pauseTime = Time.time;
434
+
435
+ yield return SuspensionCoroutine();
436
+
437
+ startTime += Time.time - pauseTime;
438
+
439
+ StartCoroutine(TimeCoroutine(startTime));
440
+
441
+ Debug.Log("再開");
442
+
443
+ }
444
+
445
+ ```

7

追記

2021/02/05 15:36

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -287,3 +287,41 @@
287
287
  }
288
288
 
289
289
  ```
290
+
291
+
292
+
293
+ ### 追記④
294
+
295
+
296
+
297
+ ```C#
298
+
299
+ IEnumerator YTurnToTarget(Transform trf, Transform target){
300
+
301
+ Vector3 dir = (target.position - trf.position).normalized;
302
+
303
+ Debug.Log(dir.y);
304
+
305
+ Vector3 baseForward = trf.forward;
306
+
307
+ for (float time = 0.0f; time < this.animationLength; time += Time.deltaTime)
308
+
309
+ {
310
+
311
+ float t = time / this.animationLength;
312
+
313
+ Quaternion q = Quaternion.Euler(0.0f, Mathf.Lerp(0.0f, dir.y, t), 0.0f);
314
+
315
+ trf.forward = q * baseForward;
316
+
317
+ yield return null;
318
+
319
+ }
320
+
321
+ // 補間値t=1の調整処理
322
+
323
+ trf.forward = Quaternion.Euler(0.0f, dir.y, 0.0f) * baseForward;
324
+
325
+ }
326
+
327
+ ```

6

追記③

2021/02/05 15:31

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -262,7 +262,9 @@
262
262
 
263
263
  ```C#
264
264
 
265
- IEnumerator Turn(Transform trf, Vector3 forward){
265
+ IEnumerator Turn(Transform trf){
266
+
267
+ Vector3 baseForward = trf.forward;
266
268
 
267
269
  for (float time = 0.0f; time < this.animationLength; time += Time.deltaTime)
268
270
 
@@ -272,7 +274,7 @@
272
274
 
273
275
  Quaternion q = Quaternion.Euler(0.0f, Mathf.Lerp(0.0f, 180.0f, t), 0.0f);
274
276
 
275
- trf.forward = q * forward;
277
+ trf.forward = q * baseForward;
276
278
 
277
279
  yield return null;
278
280
 
@@ -280,7 +282,7 @@
280
282
 
281
283
  // 補間値t=1の調整処理
282
284
 
283
- trf.forward = Quaternion.Euler(0.0f, 180.0f, 0.0f) * forward;
285
+ trf.forward = Quaternion.Euler(0.0f, 180.0f, 0.0f) * baseForward;
284
286
 
285
287
  }
286
288
 

5

追記③

2021/02/02 15:20

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -253,3 +253,35 @@
253
253
  ```
254
254
 
255
255
  ![イメージ説明](7e26424c8d765578f22ea31b67ea31a9.gif)
256
+
257
+
258
+
259
+ ### 追記③
260
+
261
+
262
+
263
+ ```C#
264
+
265
+ IEnumerator Turn(Transform trf, Vector3 forward){
266
+
267
+ for (float time = 0.0f; time < this.animationLength; time += Time.deltaTime)
268
+
269
+ {
270
+
271
+ float t = time / this.animationLength;
272
+
273
+ Quaternion q = Quaternion.Euler(0.0f, Mathf.Lerp(0.0f, 180.0f, t), 0.0f);
274
+
275
+ trf.forward = q * forward;
276
+
277
+ yield return null;
278
+
279
+ }
280
+
281
+ // 補間値t=1の調整処理
282
+
283
+ trf.forward = Quaternion.Euler(0.0f, 180.0f, 0.0f) * forward;
284
+
285
+ }
286
+
287
+ ```

4

追記

2021/02/02 15:15

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -227,3 +227,29 @@
227
227
  Mathf.PingPong(12,3):0, length - Mathf.Repeat(t, length * 2.0f):3
228
228
 
229
229
  ```
230
+
231
+
232
+
233
+ ### 追記②
234
+
235
+ レイの変更箇所だけ記載します。
236
+
237
+ ```C#
238
+
239
+ if (Physics.Raycast(new Ray(new Vector3(newPosition.x, 100.0f, newPosition.z), Vector3.down), out var hitInfo))
240
+
241
+ {
242
+
243
+ if(!(hitInfo.collider.CompareTag("Player") || hitInfo.collider.CompareTag("Ground"))){
244
+
245
+ newPosition = hitInfo.point;
246
+
247
+ }
248
+
249
+ Debug.Log(hitInfo.collider);
250
+
251
+ }
252
+
253
+ ```
254
+
255
+ ![イメージ説明](7e26424c8d765578f22ea31b67ea31a9.gif)

3

追記

2021/02/01 16:45

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -123,3 +123,107 @@
123
123
  現在、startPointとendPointのどちらに向かっているかを取得する方法は、
124
124
 
125
125
  まず、PingPongメソッドの往復運動が実装できてからでないと、考えることができないという状態です。
126
+
127
+
128
+
129
+ ### 追記
130
+
131
+
132
+
133
+ ・t-length。
134
+
135
+ ```C#
136
+
137
+ int length = 3;
138
+
139
+ for (int t=0; t<13; t++){
140
+
141
+ Debug.Log($"Mathf.PingPong({t},{length}):{Mathf.PingPong(t,length)}, t-length:{t-length}");
142
+
143
+ }
144
+
145
+ ```
146
+
147
+ 出力結果。
148
+
149
+ ```
150
+
151
+ Mathf.PingPong(0,3):0, t-length:-3
152
+
153
+ Mathf.PingPong(1,3):1, t-length:-2
154
+
155
+ Mathf.PingPong(2,3):2, t-length:-1
156
+
157
+ Mathf.PingPong(3,3):3, t-length:0
158
+
159
+ Mathf.PingPong(4,3):2, t-length:1
160
+
161
+ Mathf.PingPong(5,3):1, t-length:2
162
+
163
+ Mathf.PingPong(6,3):0, t-length:3
164
+
165
+ Mathf.PingPong(7,3):1, t-length:4
166
+
167
+ Mathf.PingPong(8,3):2, t-length:5
168
+
169
+ Mathf.PingPong(9,3):3, t-length:6
170
+
171
+ Mathf.PingPong(10,3):2, t-length:7
172
+
173
+ Mathf.PingPong(11,3):1, t-length:8
174
+
175
+ Mathf.PingPong(12,3):0, t-length:9
176
+
177
+ ```
178
+
179
+
180
+
181
+ ・length - Mathf.Repeat(t, length * 2.0f)
182
+
183
+ ```C#
184
+
185
+ int length = 3;
186
+
187
+ for (int t=0; t<13; t++){
188
+
189
+ Debug.Log($"Mathf.PingPong({t},{length}):{Mathf.PingPong(t,length)},
190
+
191
+ length - Mathf.Repeat(t, length * 2.0f):{length - Mathf.Repeat(t, length * 2.0f)}");
192
+
193
+ }
194
+
195
+ ```
196
+
197
+
198
+
199
+ 出力結果。
200
+
201
+ ```
202
+
203
+ Mathf.PingPong(0,3):0, length - Mathf.Repeat(t, length * 2.0f):3
204
+
205
+ Mathf.PingPong(1,3):1, length - Mathf.Repeat(t, length * 2.0f):2
206
+
207
+ Mathf.PingPong(2,3):2, length - Mathf.Repeat(t, length * 2.0f):1
208
+
209
+ Mathf.PingPong(3,3):3, length - Mathf.Repeat(t, length * 2.0f):0
210
+
211
+ Mathf.PingPong(4,3):2, length - Mathf.Repeat(t, length * 2.0f):-1
212
+
213
+ Mathf.PingPong(5,3):1, length - Mathf.Repeat(t, length * 2.0f):-2
214
+
215
+ Mathf.PingPong(6,3):0, length - Mathf.Repeat(t, length * 2.0f):3
216
+
217
+ Mathf.PingPong(7,3):1, length - Mathf.Repeat(t, length * 2.0f):2
218
+
219
+ Mathf.PingPong(8,3):2, length - Mathf.Repeat(t, length * 2.0f):1
220
+
221
+ Mathf.PingPong(9,3):3, length - Mathf.Repeat(t, length * 2.0f):0
222
+
223
+ Mathf.PingPong(10,3):2, length - Mathf.Repeat(t, length * 2.0f):-1
224
+
225
+ Mathf.PingPong(11,3):1, length - Mathf.Repeat(t, length * 2.0f):-2
226
+
227
+ Mathf.PingPong(12,3):0, length - Mathf.Repeat(t, length * 2.0f):3
228
+
229
+ ```

2

改行修正

2021/01/31 17:12

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -104,9 +104,9 @@
104
104
 
105
105
 
106
106
 
107
- また、位置ベクトル間の往復運動が実装できたとして、ゲームオブジェクトをY軸周りで、進行方向に向かせたいのですが、
107
+ また、位置ベクトル間の往復運動が実装できたとして、
108
108
 
109
- どのように実装すればよいでしょうか?
109
+ ゲームオブジェクトをY軸周りで、進行方向に向かせたいのですが、どのように実装すればよいでしょうか?
110
110
 
111
111
  Y軸周りで向きを設定することに関しては、進行方向のベクトルをdirとすると、
112
112
 
@@ -116,9 +116,9 @@
116
116
 
117
117
  ```
118
118
 
119
- で設定できると考えていて、進行方向は、startPointかendPointのどちらかから、
119
+ で設定できると考えていて、
120
120
 
121
- 求めることができることはわかっていますが、
121
+ 進行方向は、startPointかendPointのどちらかから、求めることができることはわかっていますが、
122
122
 
123
123
  現在、startPointとendPointのどちらに向かっているかを取得する方法は、
124
124
 

1

改行修正

2021/01/30 17:55

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -8,7 +8,9 @@
8
8
 
9
9
  やりたいこととしては、キャラクタの往復運動です。
10
10
 
11
- PingPongメソッドで実装可能であれば、おそらく1番手軽な実装になると思うのでPingPongメソッドで実装したいと考えています。
11
+ PingPongメソッドで実装可能であれば、おそらく1番手軽な実装になると思うのでPingPongメソッドで
12
+
13
+ 実装したいと考えています。
12
14
 
13
15
 
14
16
 
@@ -66,7 +68,9 @@
66
68
 
67
69
  ```
68
70
 
69
- 上記でゲームを実行したところ、往復運動はするものの、直線上の動きではなく、カクカクとした動きとなってしまいました。
71
+ 上記でゲームを実行したところ、往復運動はするものの、直線上の動きではなく、
72
+
73
+ カクカクとした動きとなってしまいました。
70
74
 
71
75
  この不具合の原因は、x座標とz座標とで、dirの最大値に到達するタイミングが合わないためと考えています。
72
76
 
@@ -74,13 +78,15 @@
74
78
 
75
79
 
76
80
 
81
+ ちなみに、dx=-dxのような処理をしているのは、
82
+
77
- ちなみに、dx=-dxのような処理をしているのは、PingPongメソッドの第2引数が負の値に対応していないみたいだからです。
83
+ PingPongメソッドの第2引数が負の値に対応していないみたいだからです。
78
84
 
79
85
  [以前の質問](https://teratail.com/questions/318056)は、「負の値も振り幅にする」であって、
80
86
 
81
- 片道方向ならば、もしかしたら、第2引数で負の値に対応しているのかもしれないと期待したのですが、ダメそうでした。
87
+ 片道方向ならば、もしかしたら、第2引数で負の値に対応しているのかもしれないと期待したのですが、
82
88
 
83
- 下記のようなログを取ってみました。
89
+ ダメそうでした。下記のようなログを取ってみました。
84
90
 
85
91
  負の値に対応してなさそうというのはわかるのですが、なぜ一律に-4の出力なるのかは不明です。
86
92
 
@@ -110,7 +116,9 @@
110
116
 
111
117
  ```
112
118
 
113
- で設定できると考えていて、進行方向は、startPointかendPointのどちらかから、求めることができることはわかっていますが、
119
+ で設定できると考えていて、進行方向は、startPointかendPointのどちらかから、
120
+
121
+ 求めることができることはわかっていますが、
114
122
 
115
123
  現在、startPointとendPointのどちらに向かっているかを取得する方法は、
116
124