###前提・実現したいこと
先日 unityで乱数を重複させずにそれを繰り返すというコードの書き方がわからなくて質問させていただきました。(https://teratail.com/questions/94921)
私が書きたかったのは、https://teratail.com/questions/94741
ここを参考にして、テトリスのミノ(ブロック)7つをランダムで重複がなく生成させ、その7つが生成しきったら、またそれを繰り返す、というコードでした。
幸いなことにある方わかりやすいようにコードを書いてくださいました。
しかし、私はUnity及びC#の初心者なので、軽く理解できる程度で、
自分のUnityに組み込むことができませんでした。
実際に何をしたかったのかというと、下記のコードでは テトリスのミノを3秒(おそらく)ごとに重複のないように7つを1つずつ生成し、それを繰り返す となっているのですが、もともと私が自分で書いたコードではspawnNext()というのにしていて、別のオブジェクトからspawnNext()を出力させることで、ミノを生成させていました。 このコードのどの部分を変えれば 別のオブジェクトから出力が来るまで、ミノを出現させず、出力が来たら、生成するというコードに書き換えられますか?
###該当のソースコード
C#
1using UnityEngine; 2using System.Linq; 3using System; 4using System.Collections; 5 6public class createRandObjs : MonoBehaviour 7{ 8 //とりあえずインスペクタからオブジェクトを追加 9 [SerializeField] 10 GameObject[] objcts; 11 12 //何秒おきに出力するかを指定 13 static readonly float LOOP_INTERVAL = 3f; 14 15 //Coroutineをキャッシュする変数 16 Coroutine landObjLoopCorutine; 17 18 void Start() 19 { 20 // 実行 21 startLandObjLoop(); 22 } 23 24 25 /// <summary> 26 /// ループのスタート 27 /// </summary> 28 void startLandObjLoop() 29 { 30 //このGameObjectが非表示の時にlandObjLoopを実行されるとエラーになるのでその場合実行させない 31 if (!gameObject.activeInHierarchy) 32 { 33 #if UNITY_EDITOR 34 Debug.Log("このオブジェクト非表示中だから実行できないよ"); 35 #endif 36 37 return; 38 } 39 40 //実行中なら重複するので一旦停止 41 stopLandObjLoop(); 42 43 //オブジェクトの出力をスタート 44 StartCoroutine( landObjLoop() ); 45 } 46 47 48 /// <summary> 49 /// ループのストップ 50 /// </summary> 51 void stopLandObjLoop() 52 { 53 if (landObjLoopCorutine != null) StopCoroutine(landObjLoopCorutine); 54 } 55 56 57 /// <summary> 58 /// オブジェクトを出力する 59 /// </summary> 60 void instantiateObj(int idx) 61 { 62 //とりあえずVector3.zero地点にオブジェクトを生成 63 Instantiate(objcts[idx], Vector3.zero, Quaternion.identity); 64 } 65 66 67 /// <summary> 68 /// objctsをランダムに出力し続ける 69 /// </summary> 70 IEnumerator landObjLoop() 71 { 72 //オブジェクトが無ければ何もせず終了 73 if (objcts.Length == 0) yield break; 74 75 var waitTime = new WaitForSeconds( LOOP_INTERVAL ); 76 77 //順番にカウントするための変数 78 var idx = 0; 79 //ランダムなインデックスを格納する配列 80 var objIdxAry = new int[objcts.Length]; 81 82 while(true) 83 { 84 //idxが0またはobjctsの数に達したらリセット 85 if(idx == 0 || idx == objcts.Length) 86 { 87 idx = 0; 88 objIdxAry = Enumerable.Range(0, objcts.Length).OrderBy(n => Guid.NewGuid()).Take(objcts.Length).ToArray(); 89 } 90 91 instantiateObj(objIdxAry[idx]); 92 idx++; 93 94 yield return waitTime; 95 } 96 } 97}
回答1件
あなたの回答
tips
プレビュー