반응형
던전에서 한 층에 무작위의 방을 여러 개 배치하기 위해 만든 코드의 일부이다.
만들 방의 프리팹을 ~RoomPrefabs 안에 넣어두고 중복 없이 무작위로 생성하였다.
private void MakeFloor()
{
List<int> huntingRoomIndex = new List<int>();
List<int> harvestRoomIndex = new List<int>();
List<int> emptyRoomIndex = new List<int>();
// 프리팹 개수만큼 인덱스를 저장
for (int i = 0; i < huntingRoomPrefabs.Length; i++)
{
huntingRoomIndex.Add(i);
}
for (int i = 0; i < harvestRoomsPrefabs.Length; i++)
{
harvestRoomIndex.Add(i);
}
for (int i = 0; i < emptyRoomsPrefabs.Length; i++)
{
emptyRoomIndex.Add(i);
}
// 층에 사용할 방들을 미리 만들어둠
for (int i = 0; i < huntingRoomCount[floor]; i++)
{
int roomIndex = Random.Range(0, huntingRoomIndex.Count); // 무작위 인덱스 구함
GameObject tempRoom = Instantiate(huntingRoomPrefabs[huntingRoomIndex[roomIndex]], tempRooms.transform);
huntingRoomIndex.RemoveAt(roomIndex); // 인덱스를 없애서 중복 없이 뽑을 수 있도록 한다
}
간단하게 표현하면 이렇게 된다.
List<int> list = new List<int>(); // 무작위로 뽑고 싶은 리스트
List<int> indexList = new List<int>(); // 인덱스를 저장할 리스트
// 리스트의 길이만큼 인덱스를 저장해둔다
for (int i = 0; i < list.Count; i++)
{
indexList.Add(i);
}
int count = 10; // 무작위로 몇 개 뽑을 것인지 정함
for (int i = 0; i < count; i++)
{
int index = Random.Range(0, indexList.Count); // 무작위 인덱스 구함
// ~ list[index] 사용해서 하고 싶은 일 하기 ~
indexList.RemoveAt(index); // 인덱스를 없애서 중복 없이 뽑을 수 있도록 한다
}
수학을 이용해서 조합을 구하는 방법도 있는데, 내가 만드는 것은 소규모라 이 방법이 더 편한 것 같다.
반응형
'프로그래밍 > 유니티 및 C#' 카테고리의 다른 글
[유니티/C#] csv 파일을 원하는 타입으로 읽기(Generic 사용) (0) | 2023.11.08 |
---|---|
[유니티/C#] Scroll View에 유동적인 Text 넣기 (0) | 2023.11.07 |
[유니티/C#] Json을 원하는 타입으로 읽기/쓰기 (Generic 사용) (0) | 2023.11.03 |
[유니티/C#] Text 길이에 맞춰 늘어나는 패널 만들기 (0) | 2023.11.02 |
[유니티/C#] 드래그 앤 드롭(Drag and Drop) 시스템 만들기 (1) | 2023.10.31 |