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

質問編集履歴

4

forを使って何度もコルーチンを呼び出そうとしましたがうまくいきませんでした。

2021/01/08 12:57

投稿

ActionStudio
ActionStudio

スコア39

title CHANGED
File without changes
body CHANGED
@@ -265,11 +265,12 @@
265
265
 
266
266
  void Start()
267
267
  {
268
- counting = false;
268
+ for (int i = 0; i < 3; i++)
269
+ {
270
+
269
271
 
270
- StartCoroutine("transformMug");
272
+ StartCoroutine("transformMug");
271
- StartCoroutine("transformMug");
273
+ }
272
- StartCoroutine("transformMug");
273
274
 
274
275
  }
275
276
 
@@ -347,8 +348,9 @@
347
348
  Mug1.transform.position = pos1;
348
349
  Mug2.transform.position = pos2;
349
350
  Mug3.transform.position = pos3;
350
-
351
351
 
352
+ yield return new WaitForSeconds(1.0f);
353
+
352
354
  yield break;
353
355
  }
354
356
  }

3

コルーチンを使って処理を行えるようにしました。しかし問題も発生しました。

2021/01/08 12:57

投稿

ActionStudio
ActionStudio

スコア39

title CHANGED
File without changes
body CHANGED
@@ -234,13 +234,129 @@
234
234
  }
235
235
  }
236
236
  ```
237
- かし、問題も発生してしいました
237
+ #その次にこのように変更しました
238
+ ```C#
239
+ using System.Collections;
240
+ using System.Collections.Generic;
238
- ######発生したエラーコード
241
+ using UnityEngine;
239
- Assets\Scripts\Operator.cs(45,17): error CS0161: 'Operator.transformMug()': not all code paths return a value
240
242
 
243
+ public class Operator : MonoBehaviour
244
+ {
241
- ######まだ解決していない部分
245
+ //動かす物体を指定
242
- yield break;
246
+ public GameObject Mug1;
243
- などの使い方がわかりません。上のコードの場合、どの部分に書き加えればいいのでしょうか。
247
+ public GameObject Mug2;
248
+ public GameObject Mug3;
244
249
 
250
+
251
+ //クラス内で使えるようにする
252
+ int value;
253
+
254
+ //ワールド座標の中心点
255
+ private Vector3 _center = new Vector3(0.0f, 0.0f, 0.0f);
256
+ //回転軸
257
+ private Vector3 _axis = Vector3.up;
258
+ //円運動周期
259
+ public float _period;
260
+ //実行時間指定
261
+ public float seconds;
262
+
263
+
264
+ bool counting = false;
265
+
266
+ void Start()
267
+ {
268
+ counting = false;
269
+
270
+ StartCoroutine("transformMug");
271
+ StartCoroutine("transformMug");
272
+ StartCoroutine("transformMug");
273
+
274
+ }
275
+
276
+ void Update()
277
+ {
278
+ Debug.Log("計測中");
279
+ if(counting == true)
280
+ {
281
+ seconds += Time.deltaTime;
282
+ }
283
+ }
284
+
285
+
286
+ //マグを動かす
287
+ IEnumerator transformMug()
288
+ {
289
+ Debug.Log("コルーチン開始");
290
+ counting = false;
291
+
292
+ //ランダムな数値を生成
293
+ value = Random.Range(0, 3);
294
+
295
+ //ワールド座標の中心点を決める
296
+ if (value == 1)
297
+ {
298
+ _center.z = 25.0f;
299
+ }
300
+ else if (value == 2)
301
+ {
302
+ _center.z = -25.0f;
303
+ }
304
+
305
+ Debug.Log("マグ移動開始");
306
+ counting = true;
307
+ while(seconds <= _period)
308
+ {
309
+ //端のマグが動く
310
+ if (value == 0)
311
+ {
312
+ // 中心点centerの周りを、軸axisで、period周期で円運動
313
+ Mug1.transform.RotateAround(_center, _axis, 180 / _period * Time.deltaTime);
314
+ Mug3.transform.RotateAround(_center, _axis, 180 / _period * Time.deltaTime);
315
+ yield return null;
316
+ }
317
+ else if (value == 1)//右側のマグが動く
318
+ {
319
+ // 中心点centerの周りを、軸axisで、period周期で円運動
320
+ Mug1.transform.RotateAround(_center, _axis, 180 / _period * Time.deltaTime);
321
+ Mug2.transform.RotateAround(_center, _axis, 180 / _period * Time.deltaTime);
322
+ yield return null;
323
+ }
324
+ else//左側のマグが動く
325
+ {
326
+ // 中心点centerの周りを、軸axisで、period周期で円運動
327
+ Mug2.transform.RotateAround(_center, _axis, 180 / _period * Time.deltaTime);
328
+ Mug3.transform.RotateAround(_center, _axis, 180 / _period * Time.deltaTime);
329
+ yield return null;
330
+ }
331
+ }
332
+ counting = false;
333
+
334
+
335
+ //初期位置に移動
336
+ Transform Mug1t = Mug1.transform;
337
+ Transform Mug2t = Mug2.transform;
338
+ Transform Mug3t = Mug3.transform;
339
+
340
+ Vector3 pos1 = Mug1.transform.position;
341
+ pos1.z = 50f;
342
+ Vector3 pos2 = Mug2.transform.position;
343
+ pos2.z = 0f;
344
+ Vector3 pos3 = Mug3.transform.position;
345
+ pos3.z = -50f;
346
+
347
+ Mug1.transform.position = pos1;
348
+ Mug2.transform.position = pos2;
349
+ Mug3.transform.position = pos3;
350
+
351
+
352
+ yield break;
353
+ }
354
+ }
355
+ ```
356
+ 初期位置に移動はあまり気にしないでください。
357
+ コルーチンを使って、処理を行うようにしました。
358
+ ######しかし、問題も発生してしまいました。
359
+ なぜか、二度目のカップを移動させる処理で、前回の処理と同じように移動してしまいます。毎度ランダムな数値を設定しているはずなのですがうまくいきません。どうすればいいでしょうか。
360
+
245
361
  ### 補足情報(FW/ツールのバージョンなど)
246
362
  2020.2.0のバージョンを使っていて、3Dで作っています。

2

コードを変更・改善しました。しかし問題も発生してしまいました。

2021/01/08 09:39

投稿

ActionStudio
ActionStudio

スコア39

title CHANGED
File without changes
body CHANGED
@@ -138,6 +138,109 @@
138
138
  }
139
139
  }
140
140
  ```
141
+ ###このように変更しました
142
+ ```C#
143
+ using System.Collections;
144
+ using System.Collections.Generic;
145
+ using UnityEngine;
146
+
147
+ public class Operator : MonoBehaviour
148
+ {
149
+ //動かす物体を指定
150
+ public GameObject Mug1;
151
+ public GameObject Mug2;
152
+ public GameObject Mug3;
153
+
154
+
155
+ //クラス内で使えるようにする
156
+ int value;
157
+
158
+ //ワールド座標の中心点
159
+ private Vector3 _center = new Vector3(0.0f, 0.0f, 0.0f);
160
+ //回転軸
161
+ private Vector3 _axis = Vector3.up;
162
+ //円運動周期
163
+ public float _period;
164
+ //実行時間指定
165
+ public float seconds;
166
+
167
+ bool counting = false;
168
+
169
+ void Start()
170
+ {
171
+ counting = false;
172
+
173
+ StartCoroutine("transformMug");
174
+
175
+ }
176
+
177
+ void Update()
178
+ {
179
+ if(counting == true)
180
+ {
181
+ seconds += Time.deltaTime;
182
+ }
183
+ }
184
+
185
+
186
+ //マグを動かす
187
+ IEnumerator transformMug()
188
+ {
189
+ counting = false;
190
+
191
+ //ランダムな数値を生成
192
+ value = Random.Range(0, 1);
193
+
194
+ //ワールド座標の中心点を決める
195
+ if (value == 1)
196
+ {
197
+ _center.z = 25.0f;
198
+ }
199
+ else if (value == 2)
200
+ {
201
+ _center.z = -25.0f;
202
+ }
203
+
204
+ counting = true;
205
+ while(seconds <= _period)
206
+ {
207
+ //端のマグが動く
208
+ if (value == 0)
209
+ {
210
+ // 中心点centerの周りを、軸axisで、period周期で円運動
211
+ Mug1.transform.RotateAround(_center, _axis, 180 / _period * Time.deltaTime);
212
+ Mug3.transform.RotateAround(_center, _axis, 180 / _period * Time.deltaTime);
213
+ }
214
+ else if (value == 1)//右側のマグが動く
215
+ {
216
+ // 中心点centerの周りを、軸axisで、period周期で円運動
217
+ Mug1.transform.RotateAround(_center, _axis, 180 / _period * Time.deltaTime);
218
+ Mug2.transform.RotateAround(_center, _axis, 180 / _period * Time.deltaTime);
219
+ }
220
+ else//左側のマグが動く
221
+ {
222
+ // 中心点centerの周りを、軸axisで、period周期で円運動
223
+ Mug2.transform.RotateAround(_center, _axis, 180 / _period * Time.deltaTime);
224
+ Mug3.transform.RotateAround(_center, _axis, 180 / _period * Time.deltaTime);
225
+ }
226
+ }
227
+ counting = false;
228
+
229
+
230
+ Mug1.transform.Translate(0, 20, 50);
231
+ Mug2.transform.Translate(0, 20, 0);
232
+ Mug3.transform.Translate(0, 20, -50);
233
+
234
+ }
235
+ }
236
+ ```
237
+ しかし、問題も発生してしまいました。
238
+ ######発生したエラーコード
141
- このように、Updateに入っていたものをMugに入れ、ifをwhileにし、startでMugを呼び出すことで、マグカップがランダムに何回も移動できるようにしようとしたのですが、これではupdateが呼び出されず時間管理ができずに、startが無限ループになってしまいました。
239
+ Assets\Scripts\Operator.cs(45,17): error CS0161: 'Operator.transformMug()': not all code paths return a value
240
+
241
+ ######まだ解決していない部分
242
+ yield break;
243
+ などの使い方がわかりません。上のコードの場合、どの部分に書き加えればいいのでしょうか。
244
+
142
245
  ### 補足情報(FW/ツールのバージョンなど)
143
246
  2020.2.0のバージョンを使っていて、3Dで作っています。

1

問題点について、わかりやすいようにしました。

2021/01/07 23:39

投稿

ActionStudio
ActionStudio

スコア39

title CHANGED
@@ -1,1 +1,1 @@
1
- オブジェクトをランダムに動かす操作を繰り返したい
1
+ オブジェクトをランダムに動かす操作を繰り返したい(カップシャッフルゲーム)
body CHANGED
@@ -1,11 +1,13 @@
1
1
  ### オブジェクトをランダムに動かす操作を繰り返したい
2
2
 
3
- unityで、C#を使ってマグカップを何度か動かし、最初に目印を入れておいたマグカップがどこに移動したかを当てるゲームを作っています。
3
+ unityで、C#を使ってマグカップを何度か動かし、最初に目印を入れておいたマグカップがどこに移動したかを当てるカップシャッフルゲームを作っています。
4
4
  ランダムに移動させたのちに、また同じ操作を繰り返して何度も位置を変えたいのですが、うまくいきません。
5
5
 
6
6
  ### 発生している問題
7
7
 
8
- ランダムに移動する操作が一度しか行えず、複数回行う方法がわからない。
8
+ 1.ランダムに移動する操作が一度しか行えず、複数回行う方法がわからない。
9
+ 2.時間計測でオブジェクトを動かしているため、時間計測を合わせて実行しなければいけないが、処理を繰り返す場合にその実行方法がわからない。
10
+ 3.カップを移動させた後もう一度入れ替えの操作を繰り返した場合、カップが想定した位置でなくなってしまうため、想定外の場所に移動してしまう。
9
11
 
10
12
  ### 該当のソースコード
11
13