디아블로 스타일의 아이템 설계 방법

무작위 옵션, 희귀도, 전리품 테이블을 조합해 반복 플레이를 지탱하는 아이템 시스템을 설계합니다. 데이터 구조와 밸런싱 규칙을 중심으로 구현 가능한 형태로 정리합니다.

아이템을 ‘수치 묶음’이 아니라 선택으로 설계하기

디아블로 스타일의 아이템 시스템은 무작위 수치를 많이 붙이는 기능만을 뜻하지 않습니다. 플레이어가 새 아이템을 얻을 때마다 지금 장비를 바꿀지, 빌드의 방향을 바꿀지, 나중을 위해 보관할지 판단하게 만드는 설계입니다.

좋은 아이템은 공격력만 높이지 않습니다. 생존, 자원 회복, 이동, 특정 스킬 강화처럼 서로 다른 가치를 제공해야 합니다. 이때 옵션의 숫자 범위와 등장 규칙이 불명확하면, 플레이어는 비교 피로만 느끼고 전리품의 기대감을 잃습니다.

아이템을 구성하는 네 층

아이템 데이터는 보통 기본 아이템(Base), 희귀도(Rarity), 접두사/접미사(Affix), 고유 효과(Unique Effect)로 나누면 관리하기 쉽습니다.

flowchart TD
    A[기본 아이템 선택] --> B[아이템 레벨 결정]
    B --> C[희귀도 굴림]
    C --> D[옵션 슬롯 수 결정]
    D --> E[조건에 맞는 옵션 후보 생성]
    E --> F[중복 및 충돌 검사]
    F --> G[옵션 수치 굴림]
    G --> H[최종 아이템 생성]

기본 아이템: 장비의 정체성

기본 아이템은 무기 종류, 방어구 부위, 요구 레벨, 기본 공격력이나 방어력처럼 변하지 않는 성질을 가집니다. 예를 들어 양손 검은 높은 기본 피해량과 느린 공격 속도, 단검은 낮은 기본 피해량과 빠른 공격 속도라는 교환 관계를 가져야 합니다.

기본 아이템의 역할이 약하면 모든 장비가 옵션만 다른 같은 물건이 됩니다. 반대로 기본 아이템의 차이가 너무 크면 옵션 설계가 의미를 잃습니다. 기본 성능은 장비의 방향을 정하고, 옵션은 그 방향을 세부적으로 조정하는 정도가 적절합니다.

무기 종류별 기본 능력과 무작위 옵션이 함께 표시된 RPG 아이템 툴팁 예시

희귀도: 옵션 수와 규칙의 차이

희귀도는 단순한 색상이 아니라 아이템 생성 규칙입니다. 아래처럼 정의할 수 있습니다.

희귀도옵션 수 예시설계 목적
일반0기본 아이템의 역할을 보여 준다
마법1~2특정 능력치를 빠르게 확보한다
희귀3~6여러 옵션의 조합으로 빌드를 강화한다
전설/고유고정 효과 + 제한된 옵션플레이 방식을 바꾸는 목표 보상이다

전설 아이템을 희귀 아이템의 단순한 상위 호환으로만 만들면, 희귀 아이템은 금방 쓸모없어집니다. 전설 효과는 예를 들어 “투사체가 한 번 더 관통한다”, “보호막이 있을 때 냉기 피해가 증가한다”처럼 스킬 운용을 바꾸는 방식이 좋습니다. 이 경우 높은 수치의 희귀 아이템도 여전히 경쟁력을 가질 수 있습니다.

옵션 풀을 데이터로 정의하기

옵션은 코드에 직접 조건문으로 넣기보다 데이터 테이블로 관리해야 밸런스 조정과 콘텐츠 추가가 쉬워집니다. 각 옵션에는 최소한 다음 정보가 필요합니다.

  • 적용 가능한 장비 부위
  • 최소 아이템 레벨
  • 수치 범위와 티어
  • 가중치
  • 그룹 ID
  • 다른 옵션과의 충돌 조건

그룹 ID는 같은 계열 옵션의 중복을 막는 데 사용합니다. 예를 들어 flat_damage 그룹에는 “물리 피해 +n”, “화염 피해 +n”을 넣어 한 무기에 과도한 추가 피해 옵션이 겹치지 않도록 할 수 있습니다.

struct AffixDefinition
{
    std::string id;
    std::string groupId;
    std::vector<ItemSlot> allowedSlots;
    int minItemLevel;
    int weight;
    float minValue;
    float maxValue;
    StatType stat;
};

bool CanAddAffix(const AffixDefinition& candidate,
                 const std::vector<AffixDefinition>& selected,
                 int itemLevel)
{
    if (itemLevel < candidate.minItemLevel)
        return false;

    for (const auto& affix : selected)
    {
        if (affix.groupId == candidate.groupId)
            return false;
    }

    return true;
}

weight는 좋은 옵션을 희귀하게 만드는 데 쓰지만, 무조건 낮추는 방식은 위험합니다. 강력한 옵션의 확률이 지나치게 낮으면 플레이어는 목표를 향해 성장한다는 느낌보다 복권을 긁는 느낌을 받습니다. 희귀한 옵션일수록 제작, 재굴림, 목표 파밍 같은 보정 경로를 함께 제공하는 편이 좋습니다.

아이템 레벨과 옵션 티어를 분리하기

아이템 레벨은 드롭 지역이나 몬스터 레벨에 따라 정해지는 생성 기준입니다. 반면 옵션 티어는 해당 아이템 레벨에서 선택 가능한 수치 구간입니다. 둘을 분리하면 저레벨 지역에서는 최상위 옵션이 나오지 않도록 제어하면서도, 같은 옵션이 성장 구간에 맞춰 자연스럽게 강해집니다.

예를 들어 체력 옵션을 다음처럼 나눌 수 있습니다.

{
  "id": "max_health",
  "tiers": [
    { "minItemLevel": 1, "min": 10, "max": 20, "weight": 100 },
    { "minItemLevel": 20, "min": 25, "max": 40, "weight": 70 },
    { "minItemLevel": 50, "min": 50, "max": 75, "weight": 35 }
  ]
}

여기서 중요한 규칙은 고레벨 아이템이라고 항상 모든 면에서 좋아야 하는 것은 아니라는 점입니다. 높은 아이템 레벨은 더 높은 잠재력과 더 넓은 옵션 풀을 제공하되, 실제 가치에는 옵션 조합과 수치 굴림이 영향을 주도록 두는 편이 파밍의 비교 재미를 만듭니다.

수치의 가치를 같은 기준으로 비교하기

아이템 옵션을 설계할 때 가장 흔한 실수는 서로 다른 능력치를 독립적으로 조정하는 것입니다. 공격력 10%와 치명타 확률 5%가 실제로 어느 정도의 가치를 갖는지 모르면 특정 옵션만 필수가 됩니다.

간단한 시작점으로 기대 피해량을 사용할 수 있습니다.

기대 피해량 = 기본 피해량 × (1 + 치명타 확률 × 치명타 추가 배율)

예를 들어 치명타가 기본 피해의 100%를 추가로 준다면, 치명타 확률 5%는 다른 조건이 같을 때 기대 피해량을 약 5% 높입니다. 실제 게임에서는 공격 속도, 쿨다운, 적 방어력, 조건부 발동을 함께 고려해야 하지만, 이런 기준값이 있어야 옵션의 상대 가치를 추적할 수 있습니다.

생존 옵션도 같은 방식으로 환산해야 합니다. 방어력, 최대 체력, 피해 감소, 회복은 서로 다른 방식으로 작동하므로 실제 전투 로그나 시뮬레이션을 통해 평균 생존 시간을 비교하는 것이 안전합니다.

옵션 간 시너지는 의도적으로 제한하기

시너지는 빌드의 재미를 만들지만, 곱연산으로 누적되는 시너지는 쉽게 밸런스를 무너뜨립니다. 특히 다음 조합은 별도 검토가 필요합니다.

  • 공격 속도와 적중 시 발동 효과
  • 치명타 확률과 치명타 피해
  • 자원 회복과 스킬 비용 감소
  • 피해 감소와 회복 또는 보호막
  • 투사체 수 증가와 범위 피해 또는 관통

이런 옵션을 모두 같은 희귀도와 같은 슬롯에서 얻을 수 있게 두면, 특정 조합이 다른 모든 선택지를 압도할 수 있습니다. 한 가지 방법은 강한 시너지 요소를 같은 충돌 그룹에 넣거나, 서로 다른 장비 부위에 분산하는 것입니다. 또 다른 방법은 조건부 효과에 내부 재사용 대기시간, 발동 횟수 제한, 감소 효율을 적용하는 것입니다.

드롭 테이블은 ‘기대’까지 설계한다

몬스터가 어떤 장비를 떨어뜨릴지 정하는 드롭 테이블은 전투 보상 구조입니다. 보스는 특정 장비군 또는 고유 효과에 접근할 수 있게 하고, 일반 몬스터는 재료와 다양한 기본 아이템을 공급하게 하면 파밍 장소의 개성이 생깁니다.

다만 특정 보상만 지나치게 좁은 확률에 의존시키지 마세요. 플레이어가 원하는 아이템에 다가가고 있다는 신호가 필요합니다. 재료 누적, 부위별 드롭 확률 증가, 동일 보스 반복 처치 보정처럼 실패해도 진전이 남는 장치를 고려할 수 있습니다.

구현 전 점검할 질문

아이템 하나를 추가하기 전에는 다음 질문에 답할 수 있어야 합니다.

  • 이 아이템은 어떤 플레이 스타일을 강화하거나 새롭게 만드는가?
  • 같은 슬롯의 다른 선택지와 비교해 어떤 대가와 장점이 있는가?
  • 이 효과가 다른 옵션과 결합했을 때 무한 반복, 과도한 곱연산, 생존 불가 상태를 만들지는 않는가?
  • 플레이어는 이 아이템을 얻지 못했을 때도 목표에 가까워지고 있음을 알 수 있는가?
  • 수치와 등장 확률은 테스트 데이터로 조정 가능한가?

디아블로 스타일의 아이템 설계는 무작위성 자체가 목적이 아닙니다. 예측할 수 없는 보상 속에서도 이해 가능한 규칙과 의미 있는 선택을 제공할 때, 드롭 한 번이 다음 전투를 계속하게 만드는 동기가 됩니다.

#게임 시스템#아이템 설계#RPG#Unity#C++
< Back to Logs