Unityでtetrisを作っています。
unity初心者なのでいろんなサイトを見て頑張っているのですが、
一つだけどこを探してもわからないことがあります。
それは 乱数を重複なく複数回表示することです。
0~7をランダムに重複なく配列し、それを繰り返したいです。
またそれを表示して、それに対応したものを出現させることです。
https://teratail.com/questions/94741
こちらのページを見たのですが、どのようにスクリプトに入力するのかがわかりません。
どなたか初心者でもわかりやすく説明してくれる方はいませんか?
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答1件
0
ベストアンサー
コードを大幅に修正しました。
[処理内容]
-
- objctsに指定したGameObjectをランダムで出力
-
- すべて出力完了後、配列をランダムにリセット
- 1、2の順で永遠にループ
- 止めたい場合はstopLandObjLoop()を実行する
コードは未検証です。コメントを入れているので挙動がおかしかったらご自分で修正してください。
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()).ToArray(); 89 } 90 91 instantiateObj(objIdxAry[idx]); 92 idx++; 93 94 yield return waitTime; 95 } 96 } 97}
遅延処理 Coroutine(コルーチン)の使い方について過去に回答したので見てみてください。
https://teratail.com/questions/93115
投稿2017/10/03 12:47
編集2017/10/05 19:56総合スコア1724
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/10/03 13:17
2017/10/03 13:33
2017/10/03 22:20
2017/10/04 07:38 編集
2017/10/04 08:02
2017/10/04 08:50
2017/10/04 09:11