Random 클래스를 이용하면 중복된 값이 나오기도 합니다.
중복된 값을 받아도 되는 경우는 큰 상관이 없지만 그렇지 않은 경우에는 문제가 됩니다.
이 문제를 해결하기 위해 List를 활용해 간단히 구현해보았습니다.
랜덤한 좌표에 중복 없이 큐브를 생성하는 코드입니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
|
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class CubeGenerator : MonoBehaviour
{
List<int> cubeList = new List<int>();
public GameObject cube;
[Range(0, 100)]
public int min;
[Range(0, 100)]
public int max;
void Start()
{
//CreateDuplicateRandom(min, max);
CreateUnDuplicateRandom(min, max);
for(int i = 0; i < cubeList.Count; i++)
{
Debug.Log(cubeList[i]);
Instantiate(cube, new Vector3(i , 0 , cubeList[i]), Quaternion.identity);
}
}
// 랜덤 생성 (중복 가능)
void CreateDuplicateRandom(int min, int max)
{
for (int i = 0; i < max; i++)
{
cubeList.Add(Random.Range(min, max));
}
}
// 랜덤 생성 (중복 배제)
void CreateUnDuplicateRandom(int min, int max)
{
int currentNumber = Random.Range(min, max);
for (int i = 0; i < max;)
{
if (cubeList.Contains(currentNumber))
{
currentNumber = Random.Range(min, max);
}
else
{
cubeList.Add(currentNumber);
i++;
}
}
}
}
|
cs |
랜덤을 돌려 나온 값이
리스트에 존재하지 않다면, 다시 랜덤을 돌리고
리스트에 존재한다면, 리스트에 해당 값을 추가해주고 증감시켜줍니다.
이러한 과정을 거치면 중복 없는 랜덤값으로 구성 할 수 있습니다.
여기엔 주의할 점이 있는데
랜덤으로 구성된 값들의 범위가 커질수록 반복을 많이해야하기 때문에 적절한 조건이 필요해질 것으로 예상됩니다.
(랜덤 메소드 자체에서 중복을 배제하는게 아니므로)
일반적으로 사용하는데는 문제가 없을 것 같습니다. 행여나 게임의 주요 퍼포먼스가 돌아가는 와중에 실시간 생성해야 한다면 코루틴을 활용할 수도 있을 것 같고요. 아니면 언제나 그렇듯이 답을 찾을 것입니다. (꼼수)
---- 번외
혹시나 반복문을 얼마나 돌게 될지 궁금해서 찍어보았습니다.
100개의 중복없는 랜덤을 만들기 위해 루프를 돈 횟수는 평균 400번 정도였습니다.
'유니티' 카테고리의 다른 글
유니티 애드몹 광고 안나오는 현상 그리고 앱 중지 현상에 대해 (0) | 2020.09.13 |
---|---|
정말 힘겹게 실습한 유니티 ML-Agent 1.0 - 텐서플로우 연동 (0) | 2020.06.24 |
유니티 랜덤 길 생성 (0) | 2020.06.11 |
유니티 조이스틱 구현하다가 황당한 경험 (0) | 2020.05.16 |
유니티에서 블렌더의 애니메이션이 Scene파일로만 나타날 때 해결법 (0) | 2020.05.10 |