質問編集履歴

4

解決記録を追記しました.

2021/09/30 07:37

投稿

toririn_blue
toririn_blue

スコア2

test CHANGED
File without changes
test CHANGED
@@ -371,3 +371,205 @@
371
371
  回答する上で,足りない情報等ございましたら,お知らせください.
372
372
 
373
373
  ご指導のほどよろしくお願いいたします.
374
+
375
+
376
+
377
+ ### 解決記録
378
+
379
+
380
+
381
+ Bongoさんのご指摘の通り,書き換えたところ目的通りのスクリプトが完成しました.
382
+
383
+
384
+
385
+ 完成したコード
386
+
387
+ ```
388
+
389
+ using System.Collections;
390
+
391
+ using System.Collections.Generic;
392
+
393
+ using UnityEngine;
394
+
395
+
396
+
397
+ /// <Summary>
398
+
399
+ /// Prefabのオブジェクトを並べるサンプルスクリプトです。
400
+
401
+ /// </Summary>
402
+
403
+ public class PrefabPlaceSample : MonoBehaviour
404
+
405
+ {
406
+
407
+ // オブジェクトを生成する元となるPrefabへの参照を保持します。
408
+
409
+ public GameObject prefabObj;
410
+
411
+
412
+
413
+ // 生成したオブジェクトの親オブジェクトへの参照を保持します。
414
+
415
+ public Transform parentTran;
416
+
417
+
418
+
419
+ // マテリアルを保持します。
420
+
421
+ public Material redMat;
422
+
423
+ public Material yellowMat;
424
+
425
+ public Material whiteMat;
426
+
427
+ public Material defaultMat;
428
+
429
+
430
+
431
+ void Start()
432
+
433
+ {
434
+
435
+ CreateBlockObject();
436
+
437
+ }
438
+
439
+
440
+
441
+ /// <Summary>
442
+
443
+ /// Prefabからブロックとして使うオブジェクトを生成します。
444
+
445
+ /// </Summary>
446
+
447
+ void CreateBlockObject()
448
+
449
+ {
450
+
451
+ int row = 6;
452
+
453
+ int column = 3;
454
+
455
+ float xOffset = 2.5f;
456
+
457
+ float zOffset = 7.1f;
458
+
459
+
460
+
461
+ List<int> numbers = new List<int>();
462
+
463
+
464
+
465
+ for (int j = 0; j < row; j++)
466
+
467
+ {
468
+
469
+ numbers.Clear();
470
+
471
+ for (int k = 1; k <= column; k++)
472
+
473
+ {
474
+
475
+ // まず,List numbers に数字を追加します.
476
+
477
+ numbers.Add(k);
478
+
479
+ }
480
+
481
+ for (int i = 0; i < column; i++)
482
+
483
+ {
484
+
485
+ // ゲームオブジェクトを生成します。
486
+
487
+ GameObject obj = Instantiate(prefabObj, Vector3.zero, Quaternion.identity);
488
+
489
+
490
+
491
+ // ゲームオブジェクトの親オブジェクトを設定します。
492
+
493
+ obj.transform.SetParent(parentTran);
494
+
495
+
496
+
497
+ // ゲームオブジェクトの位置を設定します。
498
+
499
+ float xPos = xOffset * i;
500
+
501
+ float zPos = zOffset * j;
502
+
503
+ obj.transform.localPosition = new Vector3(xPos, 0.0f, zPos);
504
+
505
+
506
+
507
+ // マテリアルをランダムで設定します。
508
+
509
+ if (numbers.Count > 0)
510
+
511
+ {
512
+
513
+ // ランダムに数字を取り出します.
514
+
515
+ int index = Random.Range(0, numbers.Count);
516
+
517
+ int ransu = numbers[index];
518
+
519
+ Material mat = defaultMat;
520
+
521
+ // 乱数の結果により,マテリアルを変更します.(修正済み)
522
+
523
+ switch (ransu)
524
+
525
+ {
526
+
527
+ case 1:
528
+
529
+ mat = redMat;
530
+
531
+ break;
532
+
533
+ case 2:
534
+
535
+ mat = yellowMat;
536
+
537
+ break;
538
+
539
+ case 3:
540
+
541
+ mat = whiteMat;
542
+
543
+ break;
544
+
545
+ }
546
+
547
+ //重複を避けるため,利用した数字をnumbersから消します.
548
+
549
+ numbers.RemoveAt(index);
550
+
551
+ obj.GetComponent<MeshRenderer>().material = mat;
552
+
553
+
554
+
555
+ }
556
+
557
+ }
558
+
559
+ }
560
+
561
+ }
562
+
563
+ }
564
+
565
+ ```
566
+
567
+
568
+
569
+ #### 実行結果
570
+
571
+ 行内で,3色(色固定・重複無し)のターゲットを3つランダムに等間隔で配置できています.
572
+
573
+ (画像は3列の場合)
574
+
575
+ ![完成したスクリプトの実行結果](26fabb6d11388538a1938f5061f64e22.png)

3

修正における間違えを見つけ,解決できたため.

2021/09/30 07:37

投稿

toririn_blue
toririn_blue

スコア2

test CHANGED
File without changes
test CHANGED
@@ -360,152 +360,6 @@
360
360
 
361
361
  ```
362
362
 
363
- ###修正2
364
-
365
-
366
-
367
- // ※マテリアルの種類はcolumnと同数であることが暗黙の前提で、各列にそれぞれバラバラなマテリアルを
368
-
369
- // 割り当てるのだろうと勝手に解釈したのですが、もしそうであればnumbersに追加する値は下記のように
370
-
371
- // 1~columnになるんじゃないでしょうかね?
372
-
373
- Bongoさんのご指摘の通りです.各行内でのターゲットの色を重複無くすために,このようなコードを書いています.指摘していただいた通りに,下記のように書き換えてみました.
374
-
375
-
376
-
377
- 修正したコード2
378
-
379
- ```
380
-
381
- void CreateBlockObject()
382
-
383
- {
384
-
385
- int row = 1;
386
-
387
- int column = 3;
388
-
389
- float xOffset = 2.5f;
390
-
391
- float zOffset = 7.1f;
392
-
393
-
394
-
395
- List<int> numbers = new List<int>();
396
-
397
-
398
-
399
- for (int j = 0; j < row; j++)
400
-
401
- {
402
-
403
- numbers.Clear();
404
-
405
- for (int k = 1; k <= column; k++)
406
-
407
- {
408
-
409
- // まず,List numbers に数字を追加します.
410
-
411
- numbers.Add(k);
412
-
413
- }
414
-
415
- for (int i = 0; i < column; i++)
416
-
417
- {
418
-
419
- // ゲームオブジェクトを生成します。
420
-
421
- GameObject obj = Instantiate(prefabObj, Vector3.zero, Quaternion.identity);
422
-
423
-
424
-
425
- // ゲームオブジェクトの親オブジェクトを設定します。
426
-
427
- obj.transform.SetParent(parentTran);
428
-
429
-
430
-
431
- // ゲームオブジェクトの位置を設定します。
432
-
433
- float xPos = xOffset * i;
434
-
435
- float zPos = zOffset * j;
436
-
437
- obj.transform.localPosition = new Vector3(xPos, 0.0f, zPos);
438
-
439
-
440
-
441
- // マテリアルをランダムで設定します。
442
-
443
- while (numbers.Count > 0)
444
-
445
- {
446
-
447
- // ランダムに数字を取り出します.
448
-
449
- int index = Random.Range(0, numbers.Count);
450
-
451
- int ransu = numbers[index];
452
-
453
- Material mat = defaultMat;
454
-
455
- // 乱数の結果により,マテリアルを変更します.(修正済み)
456
-
457
- switch (ransu)
458
-
459
- {
460
-
461
- case 1:
462
-
463
- mat = redMat;
464
-
465
- break;
466
-
467
- case 2:
468
-
469
- mat = yellowMat;
470
-
471
- break;
472
-
473
- case 3:
474
-
475
- mat = whiteMat;
476
-
477
- break;
478
-
479
- }
480
-
481
- //重複を避けるため,利用した数字をnumbersから消します.
482
-
483
- numbers.RemoveAt(index);
484
-
485
- obj.GetComponent<MeshRenderer>().material = mat;
486
-
487
-
488
-
489
- }
490
-
491
- }
492
-
493
- }
494
-
495
- }
496
-
497
- }
498
-
499
- ```
500
-
501
- #### 修正コード2の実行結果
502
-
503
- ![修正コード2の実行結果](01a34c740fb473b135f2bb3a3329b9ad.png)
504
-
505
-
506
-
507
- 修正したコード2を実行した結果,一番最初のターゲット以外はマテリアルが変更されませんでした.
508
-
509
363
 
510
364
 
511
365
  ### 最後に

2

1570pさんと,Bongoさんの指摘を受けて,修正した部分を追記しました.

2021/09/30 06:56

投稿

toririn_blue
toririn_blue

スコア2

test CHANGED
File without changes
test CHANGED
@@ -260,6 +260,252 @@
260
260
 
261
261
 
262
262
 
263
+ ###修正1
264
+
265
+ 1570pさんに,case 0 (case 3)(つまりmaterialをransuを使って変更しない)場合に何か起きているのでは?とご指摘していただいたので,defaultMatというmaterialから必ずransuを用いて,materialを変更するように,下記のように書き換えました.
266
+
267
+
268
+
269
+ 実行結果としては,変わりませんでした.
270
+
271
+
272
+
273
+ 修正したコード1
274
+
275
+
276
+
277
+ ```
278
+
279
+ public class PrefabPlaceSample : MonoBehaviour
280
+
281
+ {
282
+
283
+ // オブジェクトを生成する元となるPrefabへの参照を保持します。
284
+
285
+ public GameObject prefabObj;
286
+
287
+
288
+
289
+ // 生成したオブジェクトの親オブジェクトへの参照を保持します。
290
+
291
+ public Transform parentTran;
292
+
293
+
294
+
295
+ // マテリアルを保持します。
296
+
297
+ public Material redMat;
298
+
299
+ public Material yellowMat;
300
+
301
+ public Material whiteMat;
302
+
303
+ public Material defaultMat;
304
+
305
+
306
+
307
+ 〜〜〜
308
+
309
+
310
+
311
+ while (numbers.Count > 0)
312
+
313
+ {
314
+
315
+ // ランダムに数字を取り出します.
316
+
317
+ int index = Random.Range(0, numbers.Count);
318
+
319
+ int ransu = numbers[index];
320
+
321
+ Material mat = defaultMat;
322
+
323
+ // 乱数の結果により,マテリアルを変更します.(修正済み)
324
+
325
+ switch (ransu)
326
+
327
+ {
328
+
329
+ case 1:
330
+
331
+ mat = redMat;
332
+
333
+ break;
334
+
335
+ case 2:
336
+
337
+ mat = yellowMat;
338
+
339
+ break;
340
+
341
+ case 3:
342
+
343
+ mat = whiteMat;
344
+
345
+ break;
346
+
347
+ }
348
+
349
+ //重複を避けるため,利用した数字をnumbersから消します.
350
+
351
+ numbers.RemoveAt(index);
352
+
353
+ obj.GetComponent<MeshRenderer>().material = mat;
354
+
355
+ }
356
+
357
+
358
+
359
+ 〜〜〜
360
+
361
+ ```
362
+
363
+ ###修正2
364
+
365
+
366
+
367
+ // ※マテリアルの種類はcolumnと同数であることが暗黙の前提で、各列にそれぞれバラバラなマテリアルを
368
+
369
+ // 割り当てるのだろうと勝手に解釈したのですが、もしそうであればnumbersに追加する値は下記のように
370
+
371
+ // 1~columnになるんじゃないでしょうかね?
372
+
373
+ Bongoさんのご指摘の通りです.各行内でのターゲットの色を重複無くすために,このようなコードを書いています.指摘していただいた通りに,下記のように書き換えてみました.
374
+
375
+
376
+
377
+ 修正したコード2
378
+
379
+ ```
380
+
381
+ void CreateBlockObject()
382
+
383
+ {
384
+
385
+ int row = 1;
386
+
387
+ int column = 3;
388
+
389
+ float xOffset = 2.5f;
390
+
391
+ float zOffset = 7.1f;
392
+
393
+
394
+
395
+ List<int> numbers = new List<int>();
396
+
397
+
398
+
399
+ for (int j = 0; j < row; j++)
400
+
401
+ {
402
+
403
+ numbers.Clear();
404
+
405
+ for (int k = 1; k <= column; k++)
406
+
407
+ {
408
+
409
+ // まず,List numbers に数字を追加します.
410
+
411
+ numbers.Add(k);
412
+
413
+ }
414
+
415
+ for (int i = 0; i < column; i++)
416
+
417
+ {
418
+
419
+ // ゲームオブジェクトを生成します。
420
+
421
+ GameObject obj = Instantiate(prefabObj, Vector3.zero, Quaternion.identity);
422
+
423
+
424
+
425
+ // ゲームオブジェクトの親オブジェクトを設定します。
426
+
427
+ obj.transform.SetParent(parentTran);
428
+
429
+
430
+
431
+ // ゲームオブジェクトの位置を設定します。
432
+
433
+ float xPos = xOffset * i;
434
+
435
+ float zPos = zOffset * j;
436
+
437
+ obj.transform.localPosition = new Vector3(xPos, 0.0f, zPos);
438
+
439
+
440
+
441
+ // マテリアルをランダムで設定します。
442
+
443
+ while (numbers.Count > 0)
444
+
445
+ {
446
+
447
+ // ランダムに数字を取り出します.
448
+
449
+ int index = Random.Range(0, numbers.Count);
450
+
451
+ int ransu = numbers[index];
452
+
453
+ Material mat = defaultMat;
454
+
455
+ // 乱数の結果により,マテリアルを変更します.(修正済み)
456
+
457
+ switch (ransu)
458
+
459
+ {
460
+
461
+ case 1:
462
+
463
+ mat = redMat;
464
+
465
+ break;
466
+
467
+ case 2:
468
+
469
+ mat = yellowMat;
470
+
471
+ break;
472
+
473
+ case 3:
474
+
475
+ mat = whiteMat;
476
+
477
+ break;
478
+
479
+ }
480
+
481
+ //重複を避けるため,利用した数字をnumbersから消します.
482
+
483
+ numbers.RemoveAt(index);
484
+
485
+ obj.GetComponent<MeshRenderer>().material = mat;
486
+
487
+
488
+
489
+ }
490
+
491
+ }
492
+
493
+ }
494
+
495
+ }
496
+
497
+ }
498
+
499
+ ```
500
+
501
+ #### 修正コード2の実行結果
502
+
503
+ ![修正コード2の実行結果](01a34c740fb473b135f2bb3a3329b9ad.png)
504
+
505
+
506
+
507
+ 修正したコード2を実行した結果,一番最初のターゲット以外はマテリアルが変更されませんでした.
508
+
263
509
 
264
510
 
265
511
  ### 最後に

1

初心者マークの付け忘れ

2021/09/30 06:43

投稿

toririn_blue
toririn_blue

スコア2

test CHANGED
File without changes
test CHANGED
@@ -260,6 +260,8 @@
260
260
 
261
261
 
262
262
 
263
+
264
+
263
265
  ### 最後に
264
266
 
265
267