내일배움캠프/Unity Final Projcet
[Unity] 랜덤 카드 뽑기 기능 구현
danpat77
2025. 4. 11. 21:09
개요
게임 내에서 플레이어가 편성한 포탑 카드들 중 일부를 랜덤으로 뽑아 화면에 보여주는 기능을 구현했습니다.
중복 없이 무작위로 선택하고, 선택된 카드를 카드 UI에 적용하는 것이 목표였습니다.
문제 상황
처음에는 단순히 Random.Range를 사용해서 리스트에서 랜덤으로 골라오는 방식으로 접근했지만,
같은 카드가 중복으로 선택되는 문제가 발생했습니다.
또한, 무작위 선택 후에도 **원본 리스트(towerCardList)**는 그대로 유지되어야 했기 때문에,
직접 원본을 수정할 수 없는 상황이었습니다.
해결 방법
1. 원본 리스트 복제
먼저, 무작위로 뽑기 전에 편성된 카드 리스트(towerCardList)를 복제합니다.
이렇게 하면 복제한 리스트(selectTowerCardList)에서 자유롭게 삭제하거나 조작할 수 있습니다.
public void CopyList()
{
selectTowerCardList.Clear();
foreach (var data in towerCardList)
{
selectTowerCardList.Add(data);
}
}
2. 랜덤으로 카드 뽑기
복제한 리스트에서 Random.Range를 사용해 인덱스를 랜덤으로 뽑고,
선택된 카드를 UI에 적용한 뒤, 리스트에서 제거하는 방식으로 중복 선택을 방지합니다.
public void SetRandomCards()
{
CopyList(); // 먼저 리스트 복제
isFirst = false;
TowerOperList selectData;
for (int i = 0; i < battleCardList.Count; i++)
{
int randomNum = Random.Range(0, selectTowerCardList.Count);
selectData = selectTowerCardList[randomNum];
battleCardList[i].SetInfo(selectData);
selectTowerCardList.RemoveAt(randomNum); // 선택한 카드는 리스트에서 제거
}
}
이렇게 하면 매번 새로운 카드 조합이 안정적으로 생성됩니다.
마무리
- 원본 리스트를 복제해 작업하면 원본 데이터를 보호할 수 있습니다.
- 랜덤으로 선택 후 제거하는 방식으로 중복을 방지할 수 있습니다.
- 매번 CopyList → SetRandomCards 순서로 호출하면, 새로운 랜덤 조합을 만들 수 있습니다.