2024. 4. 15. 20:43ㆍUnity/Unity 학습정리
게임을 하다보면 아이템을 선택하는 순간이 찾아온다.
여러 아이템을 배열에 집어넣어놓고 랜덤한 그 중 랜덤한 아이템을 뽑아서 사용할 때 인덱스의 값이 중복이 되게 하고 싶지 않을때가 있다.
ex) Int arr[] = {0,1,2,3,4,5,6} 중에서 랜덤으로 3개의 숫자를 뽑지만 중복이 되지 않게 한다.
이때 C#의 자료구조 해쉬 셋을 이용하여 숫자가 중복되지 않게 뽑을 수 있다. 기본적으로 해쉬 셋은 중복을 허용하지 않는다
1. 해시(Hash)란?
해시란 저장 또는 검색에서 자주 사용되는 자료구조입니다. 해시는 입력 데이터를 고정된 길이의 데이터로 변환한 값을 말합니다. 데이터의 KEY값이 '해시 함수(Hash Function)'에 의해서 변환되어 'Hash Value'가 되는 것입니다.
자료구조의 특징
- 키(KEY)와 데이터(DATA)가 매핑할 수 있는 구조
- 키를 통해서 데이터값을 빠르게 찾을 수 있다
- 키값은 중복이 안된다.
2. 해시 셋(Hash Set)
위 해시의 특징을 기반으로 C#에서는 해시 셋이라는 자료구조를 제공하고있습니다.
데이터의 중복을 허용하지 않는 자료구조로, 중복된 데이터를 제거하거나 이미 데이터가 추가되어 있는지를 검사할 때 주로 사용됩니다.
3. 소스코드
int[] PickRandomItem(int min, int max, int count) //중복없이 아이템을 뽑아 배열에 저장
{
HashSet<int> generatedNumbers = new HashSet<int>();
while (generatedNumbers.Count < count)
{
int randomNumber = Random.Range(min, max);
generatedNumbers.Add(randomNumber);
}
return new List<int>(generatedNumbers).ToArray();
}
(최솟값<=x<최댓값)을 인자로 넘기고 뽑을 숫자 (count)갯수도 매개변수로 함수로 전달한다.
while문을 이용해 해쉬셋의 크기가 뽑을 숫자가 되면 더 이상 뽑지 않고 해당 해쉬셋을 Array(배열)로 반환한다.
int[] PickRandomItem(int min, int max, int count) //중복없이 아이템을 뽑아 배열에 저장
{
HashSet<int> generatedNumbers = new HashSet<int>();
while (generatedNumbers.Count < count)
{
int randomNumber = Random.Range(min, max);
generatedNumbers.Add(randomNumber);
}
return new List<int>(generatedNumbers).ToArray();
}
public void CreateItem()
{
items = PickRandomItem(0, 5, 3); //중복되지않는 3개의 랜덤 아이템을 가져와서 생성
for(int i=0;i<3;i++)
{
Debug.Log(items[i]);
GameObject go = Instantiate(item, this.transform);
go.transform.localPosition = this.transform.position;
go.transform.position = new Vector3(640f+x, 380f,0f);
x += 400f;
go.GetComponent<Item>().Setting(items[i]);
}
}
따라서 items 배열에 랜덤으로 뽑힌 숫자 3개가 저장되고 해당 아이템을 Instantiate()함수로 만들어, 랜덤한 아이템을 중복되지않게 배출하여 플레이어가 선택의 폭을 넓히도록 한다.
'Unity > Unity 학습정리' 카테고리의 다른 글
Unity - 각도 구하기 (0) | 2024.05.16 |
---|---|
Unity - LayerMask (0) | 2024.05.09 |
Unity - Coroutine2 (0) | 2024.04.22 |
Unity - Coroutine (1) | 2024.04.19 |
Unity Animation (1) | 2024.04.18 |