내일배움캠프/Unity Final Projcet

[Unity] 강화카드 중복 제한 로직 구현 및 딕셔너리 기반 구조 개선하기

danpat77 2025. 5. 8. 21:15

구현 배경

타워 디펜스류 게임에서 강화카드를 사용하여 타워의 능력치를 상승시키는 시스템을 만들었습니다.
하지만 개발 도중 다음과 같은 문제가 발생했는데요.

같은 강화카드를 반복해서 뽑을 경우 능력치가 무한히 상승한다는 문제였습니다.

예를 들어 사거리 증가 카드를 계속 뽑는다면, 게임 후반에는 사정거리가 화면 밖까지 닿는 상황도 발생할 수 있었죠.

그래서 저는 카드별로 뽑을 수 있는 최대 횟수를 제한하는 구조를 설계하기로 했습니다.


기존 방식의 문제

처음에는 아래와 같이 SelectedCard() 메서드 내에서 하드코딩된 조건문으로 각각 제한을 걸었습니다:

if ((cardKey == 4101 && currentAmount >= 3) ||
    (cardKey == 4103 && currentAmount >= 4) ||
    (cardKey == 4104 && currentAmount >= 1) ||
    (cardKey == 4105 && currentAmount >= 4))
{
    list.RemoveAll(card => card.key == cardKey);
}

이 방식은 빠르게 작동하지만, 단점이 몇 가지 있습니다:

  • 카드가 추가될 때마다 조건문을 일일이 수정해야 한다는 점
  • 외부에서 데이터를 관리하거나 튜닝하기 어려운 구조라는 점

개선 방향

그래서 저는 카드 키와 최대 강화 횟수를 딕셔너리로 관리하는 방식으로 리팩토링했습니다.

딕셔너리 기반 구조

// 강화 키값 별 최대 허용 횟수
private Dictionary<int, int> reinforcementLimit = new Dictionary<int, int>
{
    { 4101, 3 }, // 사거리 증가
    { 4103, 4 }, // 공격속도 증가
    { 4104, 1 }, // 동시 공격 대상 증가
    { 4105, 4 }, // 범위 공격 영역 증가
};

이제 SelectedCard() 안의 조건문은 이렇게 간단하게 바뀌었습니다:

if (reinforcementAssign.TryGetValue(deckCard, out var list))
{
    if (reinforcementLimit.TryGetValue(cardKey, out int limit) &&
        currentAmount >= limit)
    {
        list.RemoveAll(card => card.key == cardKey);
        Debug.Log($"[SelectedCard] 강화카드 {cardKey}가 제한 {limit}회를 초과해 제거됨");
    }
}

추가 디버그 기능

개발 중 상태를 확인하기 위해 다음과 같이 선택된 카드와 현재 강화 목록을 로그로 출력했습니다:

private void ListDebug(TowerOperList deckCard, int cardKey)
{
    if (reinforcementAssign.TryGetValue(deckCard, out var assignedCards))
    {
        string keyList = $"[SelectedCard] cardKey: {cardKey} / reinforcementAssign key list: ";
        foreach (var card in assignedCards)
        {
            keyList += card.key + ", ";
        }
        Debug.Log(keyList.TrimEnd(',', ' '));
    }
}

결과 및 장점

  • 강화카드의 중복 제한이 간단하고 안정적으로 관리됩니다.
  • 카드 밸런스를 데이터 기반으로 튜닝할 수 있어 개발 효율이 올라갑니다.
  • 추후 JSON이나 외부 설정으로 카드 제한을 불러오는 구조로 확장도 가능합니다.

마무리

이번 개선을 통해 무한 강화의 문제를 효과적으로 해결하고,
유지보수가 쉬운 구조로 발전시킬 수 있었습니다.