teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

11

ミスの修正

2017/10/05 19:56

投稿

IShix
IShix

スコア1729

answer CHANGED
@@ -96,7 +96,7 @@
96
96
  if(idx == 0 || idx == objcts.Length)
97
97
  {
98
98
  idx = 0;
99
- objIdxAry = Enumerable.Range(0, objcts.Length).OrderBy(n => Guid.NewGuid()).Take(objcts.Length).ToArray();
99
+ objIdxAry = Enumerable.Range(0, objcts.Length).OrderBy(n => Guid.NewGuid()).ToArray();
100
100
  }
101
101
 
102
102
  instantiateObj(objIdxAry[idx]);

10

修正

2017/10/05 19:56

投稿

IShix
IShix

スコア1729

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

9

追記

2017/10/04 07:43

投稿

IShix
IShix

スコア1729

answer CHANGED
@@ -100,6 +100,7 @@
100
100
  }
101
101
 
102
102
  instantiateObj(objIdxAry[idx]);
103
+ idx++;
103
104
 
104
105
  yield return waitTime;
105
106
  }

8

コードを修正

2017/10/04 07:28

投稿

IShix
IShix

スコア1729

answer CHANGED
@@ -1,9 +1,18 @@
1
- こんな感じでどうでょうか?
1
+ コードを大幅に修正ました。
2
2
 
3
+ **[処理内容]**
4
+ - objctsに指定したGameObjectをランダムで出力
5
+ - 出力完了後、リセットしランダムな配列を生成
6
+ - 永遠にループ
7
+ - 止めたい場合はstopLandObjLoop()を実行する
8
+
9
+
10
+ **コードは未検証です。コメントを入れているので挙動がおかしかったらご自分で修正してください。**
3
11
  ```C#
4
12
  using UnityEngine;
5
13
  using System.Linq;
6
14
  using System;
15
+ using System.Collections;
7
16
 
8
17
  public class createRandObjs : MonoBehaviour
9
18
  {
@@ -11,25 +20,92 @@
11
20
  [SerializeField]
12
21
  GameObject[] objcts;
13
22
 
14
- void Start()
15
- {
16
- //objctsの数だけランダムな配列を10回生成してみ
23
+ //何秒おきに出力すかを指定
17
- for (int i = 0; i < 10; i++)
18
- {
19
- Debug.Log("-------------------");
24
+ static readonly float LOOP_INTERVAL = 3f;
20
25
 
26
+ //Coroutineをキャッシュする変数
21
- var ary = Enumerable.Range(0, objcts.Length).OrderBy(n => Guid.NewGuid()).Take(objcts.Length).ToArray();
27
+ Coroutine landObjLoopCorutine;
22
28
 
23
- for (int s = 0; s < ary.Length; s++)
29
+ void Start()
24
- {
30
+ {
31
+ // 実行
25
- Debug.Log(string.Format("配列のインデックス : {0}" , ary[s]));
32
+ startLandObjLoop();
33
+ }
26
34
 
35
+
36
+ /// <summary>
37
+ /// ループのスタート
38
+ /// </summary>
39
+ void startLandObjLoop()
40
+ {
41
+ //このGameObjectが非表示の時にlandObjLoopを実行されるとエラーになるのでその場合実行させない
42
+ if (!gameObject.activeInHierarchy)
43
+ {
44
+ #if UNITY_EDITOR
45
+ Debug.Log("このオブジェクト非表示中だから実行できないよ");
46
+ #endif
47
+
48
+ return;
49
+ }
50
+
51
+ //実行中なら重複するので一旦停止
52
+ stopLandObjLoop();
53
+
54
+ //オブジェクトの出力をスタート
55
+ StartCoroutine( landObjLoop() );
56
+ }
57
+
58
+
59
+ /// <summary>
60
+ /// ループのストップ
61
+ /// </summary>
62
+ void stopLandObjLoop()
63
+ {
64
+ if (landObjLoopCorutine != null) StopCoroutine(landObjLoopCorutine);
65
+ }
66
+
67
+
68
+ /// <summary>
69
+ /// オブジェクトを出力する
70
+ /// </summary>
71
+ void instantiateObj(int idx)
72
+ {
27
- //とりあえずVector3.zero地点にオブジェクトを生成
73
+ //とりあえずVector3.zero地点にオブジェクトを生成
28
- Instantiate(objcts[s], Vector3.zero, Quaternion.identity);
74
+ Instantiate(objcts[idx], Vector3.zero, Quaternion.identity);
29
- }
75
+ }
76
+
77
+
78
+ /// <summary>
79
+ /// objctsをランダムに出力し続ける
80
+ /// </summary>
81
+ IEnumerator landObjLoop()
82
+ {
83
+ //オブジェクトが無ければ何もせず終了
84
+ if (objcts.Length == 0) yield break;
85
+
86
+ var waitTime = new WaitForSeconds( LOOP_INTERVAL );
87
+
88
+ //順番にカウントするための変数
89
+ var idx = 0;
90
+ //ランダムなインデックスを格納する配列
91
+ var objIdxAry = new int[objcts.Length];
92
+
93
+ while(true)
94
+ {
95
+ //idxが0またはobjctsの数に達したらリセット
96
+ if(idx == 0 || idx == objcts.Length)
97
+ {
98
+ idx = 0;
99
+ objIdxAry = Enumerable.Range(0, objcts.Length).OrderBy(n => Guid.NewGuid()).Take(objcts.Length).ToArray();
30
- }
100
+ }
101
+
102
+ instantiateObj(objIdxAry[idx]);
103
+
104
+ yield return waitTime;
31
- }
105
+ }
106
+ }
32
107
  }
33
108
  ```
34
109
 
35
- このコードだとVector3.zero地点すべてのオブジェクトが重なって生成されるの必要に応じ位置を調整してください。
110
+ 遅延処理 Coroutine(チン)の使い方つい過去に回答したのでてください。
111
+ [https://teratail.com/questions/93115](https://teratail.com/questions/93115)

7

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

2017/10/04 07:24

投稿

IShix
IShix

スコア1729

answer CHANGED
@@ -1,6 +1,5 @@
1
1
  こんな感じでどうでしょうか?
2
2
 
3
- コードは未検証です。
4
3
  ```C#
5
4
  using UnityEngine;
6
5
  using System.Linq;
@@ -19,7 +18,7 @@
19
18
  {
20
19
  Debug.Log("-------------------");
21
20
 
22
- var ary = Enumerable.Range(0, objcts.Length - 1).OrderBy(n => Guid.NewGuid()).Take(objcts.Length).ToArray();
21
+ var ary = Enumerable.Range(0, objcts.Length).OrderBy(n => Guid.NewGuid()).Take(objcts.Length).ToArray();
23
22
 
24
23
  for (int s = 0; s < ary.Length; s++)
25
24
  {

6

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

2017/10/03 13:00

投稿

IShix
IShix

スコア1729

answer CHANGED
@@ -19,11 +19,11 @@
19
19
  {
20
20
  Debug.Log("-------------------");
21
21
 
22
- var ary = Enumerable.Range(0, objcts.Length - 1).OrderBy(n => Guid.NewGuid()).Take(objcts.Length - 1).ToArray();
22
+ var ary = Enumerable.Range(0, objcts.Length - 1).OrderBy(n => Guid.NewGuid()).Take(objcts.Length).ToArray();
23
23
 
24
24
  for (int s = 0; s < ary.Length; s++)
25
25
  {
26
- Debug.Log(string.Format("配列のインデックス : {1}" , ary[s]));
26
+ Debug.Log(string.Format("配列のインデックス : {0}" , ary[s]));
27
27
 
28
28
  //とりあえずVector3.zero地点にオブジェクトを生成
29
29
  Instantiate(objcts[s], Vector3.zero, Quaternion.identity);

5

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

2017/10/03 12:57

投稿

IShix
IShix

スコア1729

answer CHANGED
@@ -19,7 +19,7 @@
19
19
  {
20
20
  Debug.Log("-------------------");
21
21
 
22
- var ary = Enumerable.Range(0, objcts.Length - 1).OrderBy(n => Guid.NewGuid()).Take(5).ToArray();
22
+ var ary = Enumerable.Range(0, objcts.Length - 1).OrderBy(n => Guid.NewGuid()).Take(objcts.Length - 1).ToArray();
23
23
 
24
24
  for (int s = 0; s < ary.Length; s++)
25
25
  {

4

すみません。追記

2017/10/03 12:53

投稿

IShix
IShix

スコア1729

answer CHANGED
@@ -1,5 +1,6 @@
1
1
  こんな感じでどうでしょうか?
2
2
 
3
+ コードは未検証です。
3
4
  ```C#
4
5
  using UnityEngine;
5
6
  using System.Linq;

3

修正

2017/10/03 12:52

投稿

IShix
IShix

スコア1729

answer CHANGED
@@ -7,7 +7,7 @@
7
7
 
8
8
  public class createRandObjs : MonoBehaviour
9
9
  {
10
- //とりあえずインスペクタからオブジェクトを追加 7個追加してください。
10
+ //とりあえずインスペクタからオブジェクトを追加
11
11
  [SerializeField]
12
12
  GameObject[] objcts;
13
13
 

2

修正

2017/10/03 12:51

投稿

IShix
IShix

スコア1729

answer CHANGED
@@ -5,7 +5,7 @@
5
5
  using System.Linq;
6
6
  using System;
7
7
 
8
- public class getRandObj : MonoBehaviour
8
+ public class createRandObjs : MonoBehaviour
9
9
  {
10
10
  //とりあえずインスペクタからオブジェクトを追加 7個追加してください。
11
11
  [SerializeField]

1

誤字修正

2017/10/03 12:50

投稿

IShix
IShix

スコア1729

answer CHANGED
@@ -13,7 +13,7 @@
13
13
 
14
14
  void Start()
15
15
  {
16
- //objctsの数だけランダムな配列を10回表示してみる
16
+ //objctsの数だけランダムな配列を10回生成してみる
17
17
  for (int i = 0; i < 10; i++)
18
18
  {
19
19
  Debug.Log("-------------------");
@@ -30,4 +30,6 @@
30
30
  }
31
31
  }
32
32
  }
33
- ```
33
+ ```
34
+
35
+ このコードだとVector3.zero地点にすべてのオブジェクトが重なって生成されるので必要に応じて位置を調整してください。