オブジェクトをランダムに動かす操作を繰り返したい
unityで、C#を使ってマグカップを何度か動かし、最初に目印を入れておいたマグカップがどこに移動したかを当てるカップシャッフルゲームを作っています。
ランダムに移動させたのちに、また同じ操作を繰り返して何度も位置を変えたいのですが、うまくいきません。
発生している問題
1.ランダムに移動する操作が一度しか行えず、複数回行う方法がわからない。
2.時間計測でオブジェクトを動かしているため、時間計測を合わせて実行しなければいけないが、処理を繰り返す場合にその実行方法がわからない。
3.カップを移動させた後もう一度入れ替えの操作を繰り返した場合、カップが想定した位置でなくなってしまうため、想定外の場所に移動してしまう。
該当のソースコード
C#
1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class Operator : MonoBehaviour 6{ 7 //動かす物体を指定 8 public GameObject Mug1; 9 public GameObject Mug2; 10 public GameObject Mug3; 11 12 13 //クラス内で使えるようにする 14 int value; 15 16 //ワールド座標の中心点 17 private Vector3 _center = new Vector3(0.0f, 0.0f, 0.0f); 18 //回転軸 19 private Vector3 _axis = Vector3.up; 20 //円運動周期 21 public float _period; 22 //実行時間指定 23 public float seconds; 24 25 26 //マグを動かす 27 void Update() 28 { 29 //ランダムな数値を生成 30 value = Random.Range(0, 1); 31 32 //ワールド座標の中心点を決める 33 if (value == 1) 34 { 35 _center.z = 25.0f; 36 } 37 else if (value == 2) 38 { 39 _center.z = -25.0f; 40 } 41 42 seconds += Time.deltaTime; 43 44 if (seconds <= _period) 45 { 46 //端のマグが動く 47 if (value == 0) 48 { 49 // 中心点centerの周りを、軸axisで、period周期で円運動 50 Mug1.transform.RotateAround(_center, _axis, 180 / _period * Time.deltaTime); 51 Mug3.transform.RotateAround(_center, _axis, 180 / _period * Time.deltaTime); 52 } 53 else if (value == 1)//右側のマグが動く 54 { 55 // 中心点centerの周りを、軸axisで、period周期で円運動 56 Mug1.transform.RotateAround(_center, _axis, 180 / _period * Time.deltaTime); 57 Mug2.transform.RotateAround(_center, _axis, 180 / _period * Time.deltaTime); 58 } 59 else//左側のマグが動く 60 { 61 // 中心点centerの周りを、軸axisで、period周期で円運動 62 Mug2.transform.RotateAround(_center, _axis, 180 / _period * Time.deltaTime); 63 Mug3.transform.RotateAround(_center, _axis, 180 / _period * Time.deltaTime); 64 } 65 } 66 } 67}
試したこと
C#
1 2 //マグを動かす 3 vois Start() 4 { 5 Mug() 6 Mug() 7 } 8 9 void Update() 10 { 11 seconds += Time.deltaTime; 12 } 13 14 void Mug() 15 { 16 //ランダムな数値を生成 17 value = Random.Range(0, 1); 18 19 //ワールド座標の中心点を決める 20 if (value == 1) 21 { 22 _center.z = 25.0f; 23 } 24 else if (value == 2) 25 { 26 _center.z = -25.0f; 27 } 28 29 30 31 while(seconds <= _period) 32 { 33 //端のマグが動く 34 if (value == 0) 35 { 36 // 中心点centerの周りを、軸axisで、period周期で円運動 37 Mug1.transform.RotateAround(_center, _axis, 180 / _period * Time.deltaTime); 38 Mug3.transform.RotateAround(_center, _axis, 180 / _period * Time.deltaTime); 39 } 40 else if (value == 1)//右側のマグが動く 41 { 42 // 中心点centerの周りを、軸axisで、period周期で円運動 43 Mug1.transform.RotateAround(_center, _axis, 180 / _period * Time.deltaTime); 44 Mug2.transform.RotateAround(_center, _axis, 180 / _period * Time.deltaTime); 45 } 46 else//左側のマグが動く 47 { 48 // 中心点centerの周りを、軸axisで、period周期で円運動 49 Mug2.transform.RotateAround(_center, _axis, 180 / _period * Time.deltaTime); 50 Mug3.transform.RotateAround(_center, _axis, 180 / _period * Time.deltaTime); 51 } 52 } 53 } 54}
###このように変更しました
C#
1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class Operator : MonoBehaviour 6{ 7 //動かす物体を指定 8 public GameObject Mug1; 9 public GameObject Mug2; 10 public GameObject Mug3; 11 12 13 //クラス内で使えるようにする 14 int value; 15 16 //ワールド座標の中心点 17 private Vector3 _center = new Vector3(0.0f, 0.0f, 0.0f); 18 //回転軸 19 private Vector3 _axis = Vector3.up; 20 //円運動周期 21 public float _period; 22 //実行時間指定 23 public float seconds; 24 25 bool counting = false; 26 27 void Start() 28 { 29 counting = false; 30 31 StartCoroutine("transformMug"); 32 33 } 34 35 void Update() 36 { 37 if(counting == true) 38 { 39 seconds += Time.deltaTime; 40 } 41 } 42 43 44 //マグを動かす 45 IEnumerator transformMug() 46 { 47 counting = false; 48 49 //ランダムな数値を生成 50 value = Random.Range(0, 1); 51 52 //ワールド座標の中心点を決める 53 if (value == 1) 54 { 55 _center.z = 25.0f; 56 } 57 else if (value == 2) 58 { 59 _center.z = -25.0f; 60 } 61 62 counting = true; 63 while(seconds <= _period) 64 { 65 //端のマグが動く 66 if (value == 0) 67 { 68 // 中心点centerの周りを、軸axisで、period周期で円運動 69 Mug1.transform.RotateAround(_center, _axis, 180 / _period * Time.deltaTime); 70 Mug3.transform.RotateAround(_center, _axis, 180 / _period * Time.deltaTime); 71 } 72 else if (value == 1)//右側のマグが動く 73 { 74 // 中心点centerの周りを、軸axisで、period周期で円運動 75 Mug1.transform.RotateAround(_center, _axis, 180 / _period * Time.deltaTime); 76 Mug2.transform.RotateAround(_center, _axis, 180 / _period * Time.deltaTime); 77 } 78 else//左側のマグが動く 79 { 80 // 中心点centerの周りを、軸axisで、period周期で円運動 81 Mug2.transform.RotateAround(_center, _axis, 180 / _period * Time.deltaTime); 82 Mug3.transform.RotateAround(_center, _axis, 180 / _period * Time.deltaTime); 83 } 84 } 85 counting = false; 86 87 88 Mug1.transform.Translate(0, 20, 50); 89 Mug2.transform.Translate(0, 20, 0); 90 Mug3.transform.Translate(0, 20, -50); 91 92 } 93}
#その次にこのように変更しました
C#
1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class Operator : MonoBehaviour 6{ 7 //動かす物体を指定 8 public GameObject Mug1; 9 public GameObject Mug2; 10 public GameObject Mug3; 11 12 13 //クラス内で使えるようにする 14 int value; 15 16 //ワールド座標の中心点 17 private Vector3 _center = new Vector3(0.0f, 0.0f, 0.0f); 18 //回転軸 19 private Vector3 _axis = Vector3.up; 20 //円運動周期 21 public float _period; 22 //実行時間指定 23 public float seconds; 24 25 26 bool counting = false; 27 28 void Start() 29 { 30 for (int i = 0; i < 3; i++) 31 { 32 33 34 StartCoroutine("transformMug"); 35 } 36 37 } 38 39 void Update() 40 { 41 Debug.Log("計測中"); 42 if(counting == true) 43 { 44 seconds += Time.deltaTime; 45 } 46 } 47 48 49 //マグを動かす 50 IEnumerator transformMug() 51 { 52 Debug.Log("コルーチン開始"); 53 counting = false; 54 55 //ランダムな数値を生成 56 value = Random.Range(0, 3); 57 58 //ワールド座標の中心点を決める 59 if (value == 1) 60 { 61 _center.z = 25.0f; 62 } 63 else if (value == 2) 64 { 65 _center.z = -25.0f; 66 } 67 68 Debug.Log("マグ移動開始"); 69 counting = true; 70 while(seconds <= _period) 71 { 72 //端のマグが動く 73 if (value == 0) 74 { 75 // 中心点centerの周りを、軸axisで、period周期で円運動 76 Mug1.transform.RotateAround(_center, _axis, 180 / _period * Time.deltaTime); 77 Mug3.transform.RotateAround(_center, _axis, 180 / _period * Time.deltaTime); 78 yield return null; 79 } 80 else if (value == 1)//右側のマグが動く 81 { 82 // 中心点centerの周りを、軸axisで、period周期で円運動 83 Mug1.transform.RotateAround(_center, _axis, 180 / _period * Time.deltaTime); 84 Mug2.transform.RotateAround(_center, _axis, 180 / _period * Time.deltaTime); 85 yield return null; 86 } 87 else//左側のマグが動く 88 { 89 // 中心点centerの周りを、軸axisで、period周期で円運動 90 Mug2.transform.RotateAround(_center, _axis, 180 / _period * Time.deltaTime); 91 Mug3.transform.RotateAround(_center, _axis, 180 / _period * Time.deltaTime); 92 yield return null; 93 } 94 } 95 counting = false; 96 97 98 //初期位置に移動 99 Transform Mug1t = Mug1.transform; 100 Transform Mug2t = Mug2.transform; 101 Transform Mug3t = Mug3.transform; 102 103 Vector3 pos1 = Mug1.transform.position; 104 pos1.z = 50f; 105 Vector3 pos2 = Mug2.transform.position; 106 pos2.z = 0f; 107 Vector3 pos3 = Mug3.transform.position; 108 pos3.z = -50f; 109 110 Mug1.transform.position = pos1; 111 Mug2.transform.position = pos2; 112 Mug3.transform.position = pos3; 113 114 yield return new WaitForSeconds(1.0f); 115 116 yield break; 117 } 118}
初期位置に移動はあまり気にしないでください。
コルーチンを使って、処理を行うようにしました。
######しかし、問題も発生してしまいました。
なぜか、二度目のカップを移動させる処理で、前回の処理と同じように移動してしまいます。毎度ランダムな数値を設定しているはずなのですがうまくいきません。どうすればいいでしょうか。
補足情報(FW/ツールのバージョンなど)
2020.2.0のバージョンを使っていて、3Dで作っています。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/01/07 08:29
2021/01/07 08:55
2021/01/07 10:12
2021/01/07 10:18
2021/01/07 10:30 編集
2021/01/07 12:43
2021/01/07 23:40
2021/01/08 06:08 編集
2021/01/08 09:39 編集