내일배움캠프/Unity Final Projcet

[Unity] 카드 뽑기 시스템 리팩터링

danpat77 2025. 4. 14. 21:07

번에는 카드 뽑기 시스템 중
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를 관리하는 방식으로 전환할 예정입니다.
  • 카드 강화 효과도 직접 수치나 설명을 설정할 수 있도록 확장할 계획입니다.

이 과정을 통해,
디자인 → 데이터 입력 → 게임 적용이 자연스럽게 이어지는
운영 자동화 구조를 목표로 하고 있습니다.