回答編集履歴

11

ミスの修正

2017/10/05 19:56

投稿

IShix
IShix

スコア1724

test CHANGED
@@ -194,7 +194,7 @@
194
194
 
195
195
  idx = 0;
196
196
 
197
- objIdxAry = Enumerable.Range(0, objcts.Length).OrderBy(n => Guid.NewGuid()).Take(objcts.Length).ToArray();
197
+ objIdxAry = Enumerable.Range(0, objcts.Length).OrderBy(n => Guid.NewGuid()).ToArray();
198
198
 
199
199
  }
200
200
 

10

修正

2017/10/05 19:56

投稿

IShix
IShix

スコア1724

test CHANGED
@@ -4,11 +4,11 @@
4
4
 
5
5
  **[処理内容]**
6
6
 
7
- - objctsに指定したGameObjectをランダムで出力
7
+ - 1. objctsに指定したGameObjectをランダムで出力
8
-
8
+
9
- - 出力完了後、リセットしランダムな配列を生成
9
+ - 2. すべて出力完了後、配列をランダムにリセット
10
-
10
+
11
- - 永遠にループ
11
+ - 1、2の順で永遠にループ
12
12
 
13
13
  - 止めたい場合はstopLandObjLoop()を実行する
14
14
 

9

追記

2017/10/04 07:43

投稿

IShix
IShix

スコア1724

test CHANGED
@@ -202,6 +202,8 @@
202
202
 
203
203
  instantiateObj(objIdxAry[idx]);
204
204
 
205
+ idx++;
206
+
205
207
 
206
208
 
207
209
  yield return waitTime;

8

コードを修正

2017/10/04 07:28

投稿

IShix
IShix

スコア1724

test CHANGED
@@ -1,6 +1,22 @@
1
- こんな感じでどうでょうか?
1
+ コードを大幅に修正ました。
2
+
3
+
4
+
2
-
5
+ **[処理内容]**
6
+
3
-
7
+ - objctsに指定したGameObjectをランダムで出力
8
+
9
+ - 出力完了後、リセットしランダムな配列を生成
10
+
11
+ - 永遠にループ
12
+
13
+ - 止めたい場合はstopLandObjLoop()を実行する
14
+
15
+
16
+
17
+
18
+
19
+ **コードは未検証です。コメントを入れているので挙動がおかしかったらご自分で修正してください。**
4
20
 
5
21
  ```C#
6
22
 
@@ -10,6 +26,8 @@
10
26
 
11
27
  using System;
12
28
 
29
+ using System.Collections;
30
+
13
31
 
14
32
 
15
33
  public class createRandObjs : MonoBehaviour
@@ -24,41 +42,173 @@
24
42
 
25
43
 
26
44
 
27
- void Start()
28
-
29
- {
30
-
31
- //objctsの数だけランダムな配列を10回生成してみる
32
-
33
- for (int i = 0; i < 10; i++)
34
-
35
- {
36
-
37
- Debug.Log("-------------------");
38
-
39
-
40
-
41
- var ary = Enumerable.Range(0, objcts.Length).OrderBy(n => Guid.NewGuid()).Take(objcts.Length).ToArray();
42
-
43
-
44
-
45
- for (int s = 0; s < ary.Length; s++)
46
-
47
- {
48
-
49
- Debug.Log(string.Format("配列のインデックス : {0}" , ary[s]));
50
-
51
-
52
-
53
- //とりあえずVector3.zero地点にオブジェクトを生成
54
-
55
- Instantiate(objcts[s], Vector3.zero, Quaternion.identity);
56
-
57
- }
58
-
59
- }
60
-
61
- }
45
+ //何秒おきに出力するかを指定
46
+
47
+ static readonly float LOOP_INTERVAL = 3f;
48
+
49
+
50
+
51
+ //Coroutineをキャッシュする変数
52
+
53
+ Coroutine landObjLoopCorutine;
54
+
55
+
56
+
57
+ void Start()
58
+
59
+ {
60
+
61
+ // 実行
62
+
63
+ startLandObjLoop();
64
+
65
+ }
66
+
67
+
68
+
69
+
70
+
71
+ /// <summary>
72
+
73
+ /// ループのスタート
74
+
75
+ /// </summary>
76
+
77
+ void startLandObjLoop()
78
+
79
+ {
80
+
81
+ //このGameObjectが非表示の時にlandObjLoopを実行されるとエラーになるのでその場合実行させない
82
+
83
+ if (!gameObject.activeInHierarchy)
84
+
85
+ {
86
+
87
+ #if UNITY_EDITOR
88
+
89
+ Debug.Log("このオブジェクト非表示中だから実行できないよ");
90
+
91
+ #endif
92
+
93
+
94
+
95
+ return;
96
+
97
+ }
98
+
99
+
100
+
101
+ //実行中なら重複するので一旦停止
102
+
103
+ stopLandObjLoop();
104
+
105
+
106
+
107
+ //オブジェクトの出力をスタート
108
+
109
+ StartCoroutine( landObjLoop() );
110
+
111
+ }
112
+
113
+
114
+
115
+
116
+
117
+ /// <summary>
118
+
119
+ /// ループのストップ
120
+
121
+ /// </summary>
122
+
123
+ void stopLandObjLoop()
124
+
125
+ {
126
+
127
+ if (landObjLoopCorutine != null) StopCoroutine(landObjLoopCorutine);
128
+
129
+ }
130
+
131
+
132
+
133
+
134
+
135
+ /// <summary>
136
+
137
+ /// オブジェクトを出力する
138
+
139
+ /// </summary>
140
+
141
+ void instantiateObj(int idx)
142
+
143
+ {
144
+
145
+ //とりあえずVector3.zero地点にオブジェクトを生成
146
+
147
+ Instantiate(objcts[idx], Vector3.zero, Quaternion.identity);
148
+
149
+ }
150
+
151
+
152
+
153
+
154
+
155
+ /// <summary>
156
+
157
+ /// objctsをランダムに出力し続ける
158
+
159
+ /// </summary>
160
+
161
+ IEnumerator landObjLoop()
162
+
163
+ {
164
+
165
+ //オブジェクトが無ければ何もせず終了
166
+
167
+ if (objcts.Length == 0) yield break;
168
+
169
+
170
+
171
+ var waitTime = new WaitForSeconds( LOOP_INTERVAL );
172
+
173
+
174
+
175
+ //順番にカウントするための変数
176
+
177
+ var idx = 0;
178
+
179
+ //ランダムなインデックスを格納する配列
180
+
181
+ var objIdxAry = new int[objcts.Length];
182
+
183
+
184
+
185
+ while(true)
186
+
187
+ {
188
+
189
+ //idxが0またはobjctsの数に達したらリセット
190
+
191
+ if(idx == 0 || idx == objcts.Length)
192
+
193
+ {
194
+
195
+ idx = 0;
196
+
197
+ objIdxAry = Enumerable.Range(0, objcts.Length).OrderBy(n => Guid.NewGuid()).Take(objcts.Length).ToArray();
198
+
199
+ }
200
+
201
+
202
+
203
+ instantiateObj(objIdxAry[idx]);
204
+
205
+
206
+
207
+ yield return waitTime;
208
+
209
+ }
210
+
211
+ }
62
212
 
63
213
  }
64
214
 
@@ -66,4 +216,6 @@
66
216
 
67
217
 
68
218
 
69
- このコードだとVector3.zero地点すべてのオブジェクトが重なって生成されるの必要に応じ位置を調整してください。
219
+ 遅延処理 Coroutine(コルーチン)の使い方つい過去に回答したのでてください。
220
+
221
+ [https://teratail.com/questions/93115](https://teratail.com/questions/93115)

7

うわーーーまた修正します。

2017/10/04 07:24

投稿

IShix
IShix

スコア1724

test CHANGED
@@ -1,8 +1,6 @@
1
1
  こんな感じでどうでしょうか?
2
2
 
3
3
 
4
-
5
- コードは未検証です。
6
4
 
7
5
  ```C#
8
6
 
@@ -40,7 +38,7 @@
40
38
 
41
39
 
42
40
 
43
- var ary = Enumerable.Range(0, objcts.Length - 1).OrderBy(n => Guid.NewGuid()).Take(objcts.Length).ToArray();
41
+ var ary = Enumerable.Range(0, objcts.Length).OrderBy(n => Guid.NewGuid()).Take(objcts.Length).ToArray();
44
42
 
45
43
 
46
44
 

6

またまた間違ってました。すみません。

2017/10/03 13:00

投稿

IShix
IShix

スコア1724

test CHANGED
@@ -40,7 +40,7 @@
40
40
 
41
41
 
42
42
 
43
- var ary = Enumerable.Range(0, objcts.Length - 1).OrderBy(n => Guid.NewGuid()).Take(objcts.Length - 1).ToArray();
43
+ var ary = Enumerable.Range(0, objcts.Length - 1).OrderBy(n => Guid.NewGuid()).Take(objcts.Length).ToArray();
44
44
 
45
45
 
46
46
 
@@ -48,7 +48,7 @@
48
48
 
49
49
  {
50
50
 
51
- Debug.Log(string.Format("配列のインデックス : {1}" , ary[s]));
51
+ Debug.Log(string.Format("配列のインデックス : {0}" , ary[s]));
52
52
 
53
53
 
54
54
 

5

またまた修正です。すみません。

2017/10/03 12:57

投稿

IShix
IShix

スコア1724

test CHANGED
@@ -40,7 +40,7 @@
40
40
 
41
41
 
42
42
 
43
- var ary = Enumerable.Range(0, objcts.Length - 1).OrderBy(n => Guid.NewGuid()).Take(5).ToArray();
43
+ var ary = Enumerable.Range(0, objcts.Length - 1).OrderBy(n => Guid.NewGuid()).Take(objcts.Length - 1).ToArray();
44
44
 
45
45
 
46
46
 

4

すみません。追記

2017/10/03 12:53

投稿

IShix
IShix

スコア1724

test CHANGED
@@ -1,6 +1,8 @@
1
1
  こんな感じでどうでしょうか?
2
2
 
3
3
 
4
+
5
+ コードは未検証です。
4
6
 
5
7
  ```C#
6
8
 

3

修正

2017/10/03 12:52

投稿

IShix
IShix

スコア1724

test CHANGED
@@ -16,7 +16,7 @@
16
16
 
17
17
  {
18
18
 
19
- //とりあえずインスペクタからオブジェクトを追加 7個追加してください。
19
+ //とりあえずインスペクタからオブジェクトを追加
20
20
 
21
21
  [SerializeField]
22
22
 

2

修正

2017/10/03 12:51

投稿

IShix
IShix

スコア1724

test CHANGED
@@ -12,7 +12,7 @@
12
12
 
13
13
 
14
14
 
15
- public class getRandObj : MonoBehaviour
15
+ public class createRandObjs : MonoBehaviour
16
16
 
17
17
  {
18
18
 

1

誤字修正

2017/10/03 12:50

投稿

IShix
IShix

スコア1724

test CHANGED
@@ -28,7 +28,7 @@
28
28
 
29
29
  {
30
30
 
31
- //objctsの数だけランダムな配列を10回表示してみる
31
+ //objctsの数だけランダムな配列を10回生成してみる
32
32
 
33
33
  for (int i = 0; i < 10; i++)
34
34
 
@@ -63,3 +63,7 @@
63
63
  }
64
64
 
65
65
  ```
66
+
67
+
68
+
69
+ このコードだとVector3.zero地点にすべてのオブジェクトが重なって生成されるので必要に応じて位置を調整してください。