質問編集履歴

4

forを使って何度もコルーチンを呼び出そうとしましたがうまくいきませんでした。

2021/01/08 12:57

投稿

ActionStudio
ActionStudio

スコア39

test CHANGED
File without changes
test CHANGED
@@ -532,138 +532,140 @@
532
532
 
533
533
  {
534
534
 
535
+ for (int i = 0; i < 3; i++)
536
+
537
+ {
538
+
539
+
540
+
541
+
542
+
543
+ StartCoroutine("transformMug");
544
+
545
+ }
546
+
547
+
548
+
549
+ }
550
+
551
+
552
+
553
+ void Update()
554
+
555
+ {
556
+
557
+ Debug.Log("計測中");
558
+
559
+ if(counting == true)
560
+
561
+ {
562
+
563
+ seconds += Time.deltaTime;
564
+
565
+ }
566
+
567
+ }
568
+
569
+
570
+
571
+
572
+
573
+ //マグを動かす
574
+
575
+ IEnumerator transformMug()
576
+
577
+ {
578
+
579
+ Debug.Log("コルーチン開始");
580
+
535
581
  counting = false;
536
582
 
537
583
 
538
584
 
539
- StartCoroutine("transformMug");
540
-
541
- StartCoroutine("transformMug");
542
-
543
- StartCoroutine("transformMug");
544
-
545
-
546
-
547
- }
548
-
549
-
550
-
551
- void Update()
552
-
553
- {
554
-
555
- Debug.Log("計測中");
556
-
557
- if(counting == true)
558
-
559
- {
560
-
561
- seconds += Time.deltaTime;
562
-
563
- }
564
-
565
- }
566
-
567
-
568
-
569
-
570
-
571
- //マグを動かす
572
-
573
- IEnumerator transformMug()
574
-
575
- {
576
-
577
- Debug.Log("コルーチン開始");
585
+ //ランダムな数値を生成
586
+
587
+ value = Random.Range(0, 3);
588
+
589
+
590
+
591
+ //ワールド座標の中心点を決める
592
+
593
+ if (value == 1)
594
+
595
+ {
596
+
597
+ _center.z = 25.0f;
598
+
599
+ }
600
+
601
+ else if (value == 2)
602
+
603
+ {
604
+
605
+ _center.z = -25.0f;
606
+
607
+ }
608
+
609
+
610
+
611
+ Debug.Log("マグ移動開始");
612
+
613
+ counting = true;
614
+
615
+ while(seconds <= _period)
616
+
617
+ {
618
+
619
+ //端のマグが動く
620
+
621
+ if (value == 0)
622
+
623
+ {
624
+
625
+ // 中心点centerの周りを、軸axisで、period周期で円運動
626
+
627
+ Mug1.transform.RotateAround(_center, _axis, 180 / _period * Time.deltaTime);
628
+
629
+ Mug3.transform.RotateAround(_center, _axis, 180 / _period * Time.deltaTime);
630
+
631
+ yield return null;
632
+
633
+ }
634
+
635
+ else if (value == 1)//右側のマグが動く
636
+
637
+ {
638
+
639
+ // 中心点centerの周りを、軸axisで、period周期で円運動
640
+
641
+ Mug1.transform.RotateAround(_center, _axis, 180 / _period * Time.deltaTime);
642
+
643
+ Mug2.transform.RotateAround(_center, _axis, 180 / _period * Time.deltaTime);
644
+
645
+ yield return null;
646
+
647
+ }
648
+
649
+ else//左側のマグが動く
650
+
651
+ {
652
+
653
+ // 中心点centerの周りを、軸axisで、period周期で円運動
654
+
655
+ Mug2.transform.RotateAround(_center, _axis, 180 / _period * Time.deltaTime);
656
+
657
+ Mug3.transform.RotateAround(_center, _axis, 180 / _period * Time.deltaTime);
658
+
659
+ yield return null;
660
+
661
+ }
662
+
663
+ }
578
664
 
579
665
  counting = false;
580
666
 
581
667
 
582
668
 
583
- //ランダムな数値を生成
584
-
585
- value = Random.Range(0, 3);
586
-
587
-
588
-
589
- //ワールド座標の中心点を決める
590
-
591
- if (value == 1)
592
-
593
- {
594
-
595
- _center.z = 25.0f;
596
-
597
- }
598
-
599
- else if (value == 2)
600
-
601
- {
602
-
603
- _center.z = -25.0f;
604
-
605
- }
606
-
607
-
608
-
609
- Debug.Log("マグ移動開始");
610
-
611
- counting = true;
612
-
613
- while(seconds <= _period)
614
-
615
- {
616
-
617
- //端のマグが動く
618
-
619
- if (value == 0)
620
-
621
- {
622
-
623
- // 中心点centerの周りを、軸axisで、period周期で円運動
624
-
625
- Mug1.transform.RotateAround(_center, _axis, 180 / _period * Time.deltaTime);
626
-
627
- Mug3.transform.RotateAround(_center, _axis, 180 / _period * Time.deltaTime);
628
-
629
- yield return null;
630
-
631
- }
632
-
633
- else if (value == 1)//右側のマグが動く
634
-
635
- {
636
-
637
- // 中心点centerの周りを、軸axisで、period周期で円運動
638
-
639
- Mug1.transform.RotateAround(_center, _axis, 180 / _period * Time.deltaTime);
640
-
641
- Mug2.transform.RotateAround(_center, _axis, 180 / _period * Time.deltaTime);
642
-
643
- yield return null;
644
-
645
- }
646
-
647
- else//左側のマグが動く
648
-
649
- {
650
-
651
- // 中心点centerの周りを、軸axisで、period周期で円運動
652
-
653
- Mug2.transform.RotateAround(_center, _axis, 180 / _period * Time.deltaTime);
654
-
655
- Mug3.transform.RotateAround(_center, _axis, 180 / _period * Time.deltaTime);
656
-
657
- yield return null;
658
-
659
- }
660
-
661
- }
662
-
663
- counting = false;
664
-
665
-
666
-
667
669
 
668
670
 
669
671
  //初期位置に移動
@@ -696,7 +698,9 @@
696
698
 
697
699
  Mug3.transform.position = pos3;
698
700
 
701
+
702
+
699
-
703
+ yield return new WaitForSeconds(1.0f);
700
704
 
701
705
 
702
706
 

3

コルーチンを使って処理を行えるようにしました。しかし問題も発生しました。

2021/01/08 12:57

投稿

ActionStudio
ActionStudio

スコア39

test CHANGED
File without changes
test CHANGED
@@ -470,19 +470,251 @@
470
470
 
471
471
  ```
472
472
 
473
- かし、問題も発生してしいました
474
-
475
- ######発生したエラーコード
476
-
477
- Assets\Scripts\Operator.cs(45,17): error CS0161: 'Operator.transformMug()': not all code paths return a value
478
-
479
-
480
-
481
- ######まだ解決していない部分
482
-
483
- yield break;
484
-
485
- などの使い方がわかりません。上のコードの場合、どの部分に書き加えればいいのでしょうか。
473
+ #その次にこのように変更しました
474
+
475
+ ```C#
476
+
477
+ using System.Collections;
478
+
479
+ using System.Collections.Generic;
480
+
481
+ using UnityEngine;
482
+
483
+
484
+
485
+ public class Operator : MonoBehaviour
486
+
487
+ {
488
+
489
+ //動かす物体を指定
490
+
491
+ public GameObject Mug1;
492
+
493
+ public GameObject Mug2;
494
+
495
+ public GameObject Mug3;
496
+
497
+
498
+
499
+
500
+
501
+ //クラス内で使えるようにする
502
+
503
+ int value;
504
+
505
+
506
+
507
+ //ワールド座標の中心点
508
+
509
+ private Vector3 _center = new Vector3(0.0f, 0.0f, 0.0f);
510
+
511
+ //回転軸
512
+
513
+ private Vector3 _axis = Vector3.up;
514
+
515
+ //円運動周期
516
+
517
+ public float _period;
518
+
519
+ //実行時間指定
520
+
521
+ public float seconds;
522
+
523
+
524
+
525
+
526
+
527
+ bool counting = false;
528
+
529
+
530
+
531
+ void Start()
532
+
533
+ {
534
+
535
+ counting = false;
536
+
537
+
538
+
539
+ StartCoroutine("transformMug");
540
+
541
+ StartCoroutine("transformMug");
542
+
543
+ StartCoroutine("transformMug");
544
+
545
+
546
+
547
+ }
548
+
549
+
550
+
551
+ void Update()
552
+
553
+ {
554
+
555
+ Debug.Log("計測中");
556
+
557
+ if(counting == true)
558
+
559
+ {
560
+
561
+ seconds += Time.deltaTime;
562
+
563
+ }
564
+
565
+ }
566
+
567
+
568
+
569
+
570
+
571
+ //マグを動かす
572
+
573
+ IEnumerator transformMug()
574
+
575
+ {
576
+
577
+ Debug.Log("コルーチン開始");
578
+
579
+ counting = false;
580
+
581
+
582
+
583
+ //ランダムな数値を生成
584
+
585
+ value = Random.Range(0, 3);
586
+
587
+
588
+
589
+ //ワールド座標の中心点を決める
590
+
591
+ if (value == 1)
592
+
593
+ {
594
+
595
+ _center.z = 25.0f;
596
+
597
+ }
598
+
599
+ else if (value == 2)
600
+
601
+ {
602
+
603
+ _center.z = -25.0f;
604
+
605
+ }
606
+
607
+
608
+
609
+ Debug.Log("マグ移動開始");
610
+
611
+ counting = true;
612
+
613
+ while(seconds <= _period)
614
+
615
+ {
616
+
617
+ //端のマグが動く
618
+
619
+ if (value == 0)
620
+
621
+ {
622
+
623
+ // 中心点centerの周りを、軸axisで、period周期で円運動
624
+
625
+ Mug1.transform.RotateAround(_center, _axis, 180 / _period * Time.deltaTime);
626
+
627
+ Mug3.transform.RotateAround(_center, _axis, 180 / _period * Time.deltaTime);
628
+
629
+ yield return null;
630
+
631
+ }
632
+
633
+ else if (value == 1)//右側のマグが動く
634
+
635
+ {
636
+
637
+ // 中心点centerの周りを、軸axisで、period周期で円運動
638
+
639
+ Mug1.transform.RotateAround(_center, _axis, 180 / _period * Time.deltaTime);
640
+
641
+ Mug2.transform.RotateAround(_center, _axis, 180 / _period * Time.deltaTime);
642
+
643
+ yield return null;
644
+
645
+ }
646
+
647
+ else//左側のマグが動く
648
+
649
+ {
650
+
651
+ // 中心点centerの周りを、軸axisで、period周期で円運動
652
+
653
+ Mug2.transform.RotateAround(_center, _axis, 180 / _period * Time.deltaTime);
654
+
655
+ Mug3.transform.RotateAround(_center, _axis, 180 / _period * Time.deltaTime);
656
+
657
+ yield return null;
658
+
659
+ }
660
+
661
+ }
662
+
663
+ counting = false;
664
+
665
+
666
+
667
+
668
+
669
+ //初期位置に移動
670
+
671
+ Transform Mug1t = Mug1.transform;
672
+
673
+ Transform Mug2t = Mug2.transform;
674
+
675
+ Transform Mug3t = Mug3.transform;
676
+
677
+
678
+
679
+ Vector3 pos1 = Mug1.transform.position;
680
+
681
+ pos1.z = 50f;
682
+
683
+ Vector3 pos2 = Mug2.transform.position;
684
+
685
+ pos2.z = 0f;
686
+
687
+ Vector3 pos3 = Mug3.transform.position;
688
+
689
+ pos3.z = -50f;
690
+
691
+
692
+
693
+ Mug1.transform.position = pos1;
694
+
695
+ Mug2.transform.position = pos2;
696
+
697
+ Mug3.transform.position = pos3;
698
+
699
+
700
+
701
+
702
+
703
+ yield break;
704
+
705
+ }
706
+
707
+ }
708
+
709
+ ```
710
+
711
+ 初期位置に移動はあまり気にしないでください。
712
+
713
+ コルーチンを使って、処理を行うようにしました。
714
+
715
+ ######しかし、問題も発生してしまいました。
716
+
717
+ なぜか、二度目のカップを移動させる処理で、前回の処理と同じように移動してしまいます。毎度ランダムな数値を設定しているはずなのですがうまくいきません。どうすればいいでしょうか。
486
718
 
487
719
 
488
720
 

2

コードを変更・改善しました。しかし問題も発生してしまいました。

2021/01/08 09:39

投稿

ActionStudio
ActionStudio

スコア39

test CHANGED
File without changes
test CHANGED
@@ -278,7 +278,213 @@
278
278
 
279
279
  ```
280
280
 
281
+ ###このように変更しました
282
+
283
+ ```C#
284
+
285
+ using System.Collections;
286
+
287
+ using System.Collections.Generic;
288
+
289
+ using UnityEngine;
290
+
291
+
292
+
293
+ public class Operator : MonoBehaviour
294
+
295
+ {
296
+
297
+ //動かす物体を指定
298
+
299
+ public GameObject Mug1;
300
+
301
+ public GameObject Mug2;
302
+
303
+ public GameObject Mug3;
304
+
305
+
306
+
307
+
308
+
309
+ //クラス内で使えるようにする
310
+
311
+ int value;
312
+
313
+
314
+
315
+ //ワールド座標の中心点
316
+
317
+ private Vector3 _center = new Vector3(0.0f, 0.0f, 0.0f);
318
+
319
+ //回転軸
320
+
321
+ private Vector3 _axis = Vector3.up;
322
+
323
+ //円運動周期
324
+
325
+ public float _period;
326
+
327
+ //実行時間指定
328
+
329
+ public float seconds;
330
+
331
+
332
+
333
+ bool counting = false;
334
+
335
+
336
+
337
+ void Start()
338
+
339
+ {
340
+
341
+ counting = false;
342
+
343
+
344
+
345
+ StartCoroutine("transformMug");
346
+
347
+
348
+
349
+ }
350
+
351
+
352
+
353
+ void Update()
354
+
355
+ {
356
+
357
+ if(counting == true)
358
+
359
+ {
360
+
361
+ seconds += Time.deltaTime;
362
+
363
+ }
364
+
365
+ }
366
+
367
+
368
+
369
+
370
+
371
+ //マグを動かす
372
+
373
+ IEnumerator transformMug()
374
+
375
+ {
376
+
377
+ counting = false;
378
+
379
+
380
+
381
+ //ランダムな数値を生成
382
+
383
+ value = Random.Range(0, 1);
384
+
385
+
386
+
387
+ //ワールド座標の中心点を決める
388
+
389
+ if (value == 1)
390
+
391
+ {
392
+
393
+ _center.z = 25.0f;
394
+
395
+ }
396
+
397
+ else if (value == 2)
398
+
399
+ {
400
+
401
+ _center.z = -25.0f;
402
+
403
+ }
404
+
405
+
406
+
407
+ counting = true;
408
+
409
+ while(seconds <= _period)
410
+
411
+ {
412
+
413
+ //端のマグが動く
414
+
415
+ if (value == 0)
416
+
417
+ {
418
+
419
+ // 中心点centerの周りを、軸axisで、period周期で円運動
420
+
421
+ Mug1.transform.RotateAround(_center, _axis, 180 / _period * Time.deltaTime);
422
+
423
+ Mug3.transform.RotateAround(_center, _axis, 180 / _period * Time.deltaTime);
424
+
425
+ }
426
+
427
+ else if (value == 1)//右側のマグが動く
428
+
429
+ {
430
+
431
+ // 中心点centerの周りを、軸axisで、period周期で円運動
432
+
433
+ Mug1.transform.RotateAround(_center, _axis, 180 / _period * Time.deltaTime);
434
+
435
+ Mug2.transform.RotateAround(_center, _axis, 180 / _period * Time.deltaTime);
436
+
437
+ }
438
+
439
+ else//左側のマグが動く
440
+
441
+ {
442
+
443
+ // 中心点centerの周りを、軸axisで、period周期で円運動
444
+
445
+ Mug2.transform.RotateAround(_center, _axis, 180 / _period * Time.deltaTime);
446
+
447
+ Mug3.transform.RotateAround(_center, _axis, 180 / _period * Time.deltaTime);
448
+
449
+ }
450
+
451
+ }
452
+
453
+ counting = false;
454
+
455
+
456
+
457
+
458
+
459
+ Mug1.transform.Translate(0, 20, 50);
460
+
461
+ Mug2.transform.Translate(0, 20, 0);
462
+
463
+ Mug3.transform.Translate(0, 20, -50);
464
+
465
+
466
+
467
+ }
468
+
469
+ }
470
+
471
+ ```
472
+
473
+ しかし、問題も発生してしまいました。
474
+
475
+ ######発生したエラーコード
476
+
281
- このように、Updateに入っていたものをMugに入れ、ifをwhileにし、startでMugを呼び出すことで、マグカップがランダムに何回も移動できるようにしようとしたのですが、これではupdateが呼び出されず時間管理ができずに、startが無限ループになってしまいました。
477
+ Assets\Scripts\Operator.cs(45,17): error CS0161: 'Operator.transformMug()': not all code paths return a value
478
+
479
+
480
+
481
+ ######まだ解決していない部分
482
+
483
+ yield break;
484
+
485
+ などの使い方がわかりません。上のコードの場合、どの部分に書き加えればいいのでしょうか。
486
+
487
+
282
488
 
283
489
  ### 補足情報(FW/ツールのバージョンなど)
284
490
 

1

問題点について、わかりやすいようにしました。

2021/01/07 23:39

投稿

ActionStudio
ActionStudio

スコア39

test CHANGED
@@ -1 +1 @@
1
- オブジェクトをランダムに動かす操作を繰り返したい
1
+ オブジェクトをランダムに動かす操作を繰り返したい(カップシャッフルゲーム)
test CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
 
4
4
 
5
- unityで、C#を使ってマグカップを何度か動かし、最初に目印を入れておいたマグカップがどこに移動したかを当てるゲームを作っています。
5
+ unityで、C#を使ってマグカップを何度か動かし、最初に目印を入れておいたマグカップがどこに移動したかを当てるカップシャッフルゲームを作っています。
6
6
 
7
7
  ランダムに移動させたのちに、また同じ操作を繰り返して何度も位置を変えたいのですが、うまくいきません。
8
8
 
@@ -12,7 +12,11 @@
12
12
 
13
13
 
14
14
 
15
- ランダムに移動する操作が一度しか行えず、複数回行う方法がわからない。
15
+ 1.ランダムに移動する操作が一度しか行えず、複数回行う方法がわからない。
16
+
17
+ 2.時間計測でオブジェクトを動かしているため、時間計測を合わせて実行しなければいけないが、処理を繰り返す場合にその実行方法がわからない。
18
+
19
+ 3.カップを移動させた後もう一度入れ替えの操作を繰り返した場合、カップが想定した位置でなくなってしまうため、想定外の場所に移動してしまう。
16
20
 
17
21
 
18
22