번에는 카드 뽑기 시스템 중
SetRandomCards() 와 SelectedCard() 메서드를 리팩터링했습니다.
복잡했던 중복 체크 로직과 카드 선택 흐름을 간결하게 정리해,
코드를 읽기 쉽게 만들고, 안정성도 함께 개선했습니다.
1. SetRandomCards() 로직 개선
기존 문제점
- 선택할 카드를 고를 때,
selectedCardList를 직접 for문으로 돌며 하나하나 중복 여부를 확인했습니다. - 코드가 복잡하고 길어 가독성이 떨어졌습니다.
- 강화 카드(copyCardKeyList)를 사용할 때 흐름이 명확하지 않았습니다.
개선 전 코드
for (int i = 0; i < battleCardList.Count; i++)
{
int randomNum = Random.Range(0, selectTowerCardList.Count);
TowerOperList selectData = selectTowerCardList[randomNum];
if (selectedCardList == null)
{
battleCardList[i].SetInfo(selectData, cardKeyList[0]);
selectTowerCardList.RemoveAt(randomNum);
}
else
{
bool test = false;
for (int j = 0; j < selectedCardList.Count; j++)
{
if (selectedCardList[j].Equals(selectData))
{
test = true;
int randomCardNum = Random.Range(0, copyCardKeyList.Count);
battleCardList[i].SetInfo(selectData, cardKeyList[randomCardNum]);
copyCardKeyList.RemoveAt(randomCardNum);
}
}
if (!test)
{
battleCardList[i].SetInfo(selectData, cardKeyList[0]);
selectTowerCardList.RemoveAt(randomNum);
}
test = false;
}
}
- 리스트를 직접 순회하며 중복을 확인
- test 플래그를 따로 관리해야 해서 코드가 복잡해짐
개선 방향
- List.Contains()로 중복 여부를 간단히 확인
- 카드 키 결정 과정을 명확하게 분리
- 카드 복사도 new List<T>로 간결화
개선 후 코드
public void SetRandomCards()
{
CopyLists();
AddCardSlots();
for (int i = 0; i < battleCardList.Count; i++)
{
if (selectTowerCardList.Count == 0)
break;
int randomIndex = Random.Range(0, selectTowerCardList.Count);
TowerOperList selectedData = selectTowerCardList[randomIndex];
selectTowerCardList.RemoveAt(randomIndex);
if (selectedCardList.Contains(selectedData))
{
if (copyCardKeyList.Count > 0)
{
int randomCardKeyIndex = Random.Range(0, copyCardKeyList.Count);
int bonusCardKey = copyCardKeyList[randomCardKeyIndex];
copyCardKeyList.RemoveAt(randomCardKeyIndex);
battleCardList[i].SetInfo(selectedData, bonusCardKey);
}
}
else
{
battleCardList[i].SetInfo(selectedData, 4000); // 기본 카드
}
}
}
개선 효과
- 중복 여부 판단을 간단하게 처리할 수 있게 되었습니다.
- 카드 키 결정 흐름이 깔끔해졌습니다.
- 코드 길이와 복잡성이 크게 줄었습니다.
2. SelectedCard() 메서드 개선
기존 문제점
- 새 카드를 선택할 때,
직접 for문을 돌면서 리스트에 중복 여부를 검사했습니다. - test 플래그 변수를 별도로 관리해야 했습니다.
개선 전 코드
bool test = false;
if (selectedCardList == null)
{
selectedCardList.Add(data);
}
else
{
for (int i = 0; i < selectedCardList.Count; i++)
{
if (selectedCardList[i].Equals(data))
{
test = true;
return;
}
}
if (!test)
{
selectedCardList.Add(data);
}
}
test = false;
- 복잡한 조건문과 for문 사용
- 의미 없는 플래그 변수 관리 필요
개선 방향
- List.Contains()를 사용해 한 줄로 간단하게 처리
- 불필요한 플래그 제거
개선 후 코드
public void SelectedCard(TowerOperList data)
{
if (!selectedCardList.Contains(data))
{
selectedCardList.Add(data);
}
}
개선 효과
- 한 줄 코드로 중복 체크가 가능해졌습니다.
- 코드 가독성이 크게 향상되었습니다.
- 실수 가능성을 줄이고, 유지보수성을 높였습니다.
최종 정리
항목 | 개선 전 | 개선 후 |
SetRandomCards() | 직접 for문을 돌며 중복 확인 | Contains() 사용으로 간단하게 중복 확인 |
SelectedCard() | 플래그 변수 + for문 사용 | Contains()로 한 줄 처리 |
마무리
이번 리팩터링을 통해
카드 뽑기 시스템의 흐름이 훨씬 깔끔하고 직관적으로 바뀌었습니다.
특히,
- 카드 선택 시 중복 체크
- 카드 정보 세팅
- 강화 카드 처리 흐름
이 부분들이 명확해지면서,
추후 카드 종류 추가나 시스템 확장 작업이 훨씬 수월해질 기반을 만들 수 있었습니다.
앞으로 작업 예정
- 엑셀 데이터와 연동하여 CardKey를 관리하는 방식으로 전환할 예정입니다.
- 카드 강화 효과도 직접 수치나 설명을 설정할 수 있도록 확장할 계획입니다.
이 과정을 통해,
디자인 → 데이터 입력 → 게임 적용이 자연스럽게 이어지는
운영 자동화 구조를 목표로 하고 있습니다.
'내일배움캠프 > Unity Final Projcet' 카테고리의 다른 글
[Unity] 2단계 확률 기반 가챠 시스템 (0) | 2025.04.17 |
---|---|
[Unity] UI 패널 전환 효과를 DOTween으로 구현하기 (0) | 2025.04.16 |
[Unity] 랜덤 카드 뽑기 기능 구현 (0) | 2025.04.11 |
[Unity] Scene 이동 후 작업이 바로 실행되지 않는 문제 (트러블슈팅) (0) | 2025.04.10 |
[Unity] GameManager 만들기 - 매니저 총괄 시스템 (0) | 2025.04.09 |