방치형 RPG 오프라인 보상 계산식: 시간 감쇠(Diminishing Returns) 설계와 복귀율 극대화 전략

방치형 RPG에서 재화 인플레이션을 억제하고 유저 리텐션을 극대화하는 오프라인 보상 시간 감쇠(Diminishing Returns) 수식 모델링과 실전 C# 구현 가이드입니다.

✓ 복사 완료!
챕터수치 공식 & 밸런싱
난이도중급
상태● 검토 완료
대상 엔진
Engine Agnostic
최종 업데이트
방치형 RPG 오프라인 보상 계산식: 시간 감쇠(Diminishing Returns) 설계와 복귀율 극대화 전략

핵심 요약

방치형 RPG에서 오프라인 보상을 시간에 비례해 단순 선형으로 지급하면 재화 인플레이션과 세션 접속 주기 붕괴가 발생합니다. 이를 해결하기 위해 초기 4~8시간은 100% 효율을 제공하고 이후 점진적으로 효율이 감소하는 시간 감쇠(Diminishing Returns) 공식을 적용해야 합니다. 다단계 계단형 또는 로그/지수 감쇠 수식과 푸시 알림, 배수 부스팅 UX를 결합하면 D1~D7 리텐션과 일일 접속 횟수(DAU Session Count)를 동시에 방어할 수 있습니다.


방치형 RPG에서 단순 비례 오프라인 보상이 위험한 이유는 무엇인가?

방치형 RPG(Idle RPG)의 핵심 가치는 “플레이어가 게임을 켜두지 않아도 성장이 지속된다”는 심리적 만족감입니다. 하지만 기획 초기 단계에서 흔히 저지르는 실수는 오프라인 보상을 아래와 같은 단순 선형 비례식으로 설계하는 것입니다.

R(t)=B×tR(t) = B \times t

여기서 R(t)R(t)는 경과 시간 tt 동안 획득하는 최종 보상이며 BB는 단위 시간당 기초 생산량(Base Yield Rate)입니다.

이 단순 비례 모델은 게임 경제와 유저 행동 패턴에 치명적인 문제를 야기합니다.

  1. 접속 동기 소멸과 세션 주기 붕괴: 1시간 뒤에 접속하든 24시간 뒤에 접속하든 시간당 보상 효율이 동일하다면 유저는 굳이 자주 접속할 이유를 잃어버립니다. 하루에 1번만 접속하는 유저가 늘어나며 세션 간격이 길어집니다.
  2. 재화 인플레이션과 콘텐츠 소모 가속: 장기 미접속(휴면) 유저가 수주일 만에 복귀했을 때 천문학적인 재화가 한 번에 쏟아져 들어옵니다. 이는 준비된 성장 밸런스 테이블을 순식간에 파괴하고 신규 스테이지를 단숨에 스킵하게 만듭니다.
  3. 인게임 액티브 플레이 가치 훼손: 오프라인 효율이 100%로 유지되면 광고 시청, 던전 공략, 장비 세팅 등 능동적인 인게임 플레이의 상대적 가치가 급격히 하락합니다.
보상 모델계산 방식경제 안정성유저 접속 유도력기획 의도 및 특징
단순 선형 비례R=B×tR = B \times t매우 취약 (인플레이션)낮음 (접속 지연)프로토타입 단계 외 사용 금지
하드 캡 (Hard Cap)R=B×min⁡(t,tmax⁡)R = B \times \min(t, t_{\max})보통 (상한선 제어)보통 (상한 시점 1회 접속)8~12시간 단일 캡 적용
다단계 시간 감쇠R=∑B⋅ri⋅ΔtiR = \sum B \cdot r_i \cdot \Delta t_i우수 (완만한 누적)매우 높음 (골든 타임 방문)구간별 효율 차등 적용 (권장)
지수 점근 감쇠R=Rmax⁡(1−e−λt)R = R_{\max}(1 - e^{-\lambda t})매우 우수 (수학적 수렴)높음 (초반 급상승 구간)정교한 수학적 통제 모델

오프라인 방치 시간에 따른 보상 획득 효율 비교 그래프


시간 감쇠(Diminishing Returns) 수식은 어떻게 설계할까?

시간 감쇠란 경과 시간이 늘어날수록 시간당 보상 획득률(Marginal Yield)이 점진적으로 감소하도록 설계하는 기법입니다. 실무에서 가장 널리 쓰이는 3가지 수학적 모델을 살펴봅니다.

1. 다단계 계단형 감쇠 모델 (Piecewise Step Decay)

실무 밸런싱에서 가장 직관적이고 기획자가 엑셀로 제어하기 쉬운 방식입니다. 시간을 특정 구간(Threshold)으로 나누고 구간별 감쇠 계수(rir_i)를 곱해 합산합니다.

  • 0 ~ 4시간 (골든 타임): 효율 100%100\% (r1=1.0r_1 = 1.0)
  • 4 ~ 8시간 (유지 구간): 효율 75%75\% (r2=0.75r_2 = 0.75)
  • 8 ~ 16시간 (감쇠 구간): 효율 40%40\% (r3=0.40r_3 = 0.40)
  • 16 ~ 24시간 (최소 보존): 효율 10%10\% (r4=0.10r_4 = 0.10)
  • 24시간 초과: 하드 캡 적용 (0%0\%)

수식으로는 다음과 같이 구간 적분 형태로 표현됩니다.

R(t)=∑i=1nB×ri×ΔtiR(t) = \sum_{i=1}^{n} B \times r_i \times \Delta t_i

단, Δti=max⁡(0,min⁡(t,Ti)−Ti−1)\Delta t_i = \max\left(0, \min(t, T_i) - T_{i-1}\right) 이며 TiT_i는 각 구간의 종료 시간입니다.

2. 로그 기반 연속 감쇠 모델 (Logarithmic Sub-linear Decay)

경과 시간에 따라 끊김 없이 완만한 곡선을 그리며 보상이 증가하도록 만드는 연속 함수입니다.

R(t)=B×(tbase+k⋅ln⁡(1+max⁡(0,t−tbase)τ))R(t) = B \times \left( t_{\text{base}} + k \cdot \ln\left(1 + \frac{\max(0, t - t_{\text{base}})}{\tau}\right) \right)
  • tbaset_{\text{base}}: 100% 기본 효율이 유지되는 기본 시간 (예: 4시간)
  • k,τk, \tau: 감쇠 곡선의 기울기와 완만함을 조절하는 스케일링 계수

이 공식은 유저 입장에서 “시간이 지나도 보상이 완전히 멈추지는 않지만 시간이 지날수록 늘어나는 속도가 매우 느리다”는 인식을 주어 상실감을 덜어줍니다.

3. 지수 점근선 모델 (Asymptotic Exponential Decay)

보상의 이론적 최댓값(Rmax⁡R_{\max})을 엄격하게 제한해야 하는 하드코어 경제 구조에 적합합니다.

R(t)=Rmax⁡×(1−e−λt)R(t) = R_{\max} \times \left( 1 - e^{-\lambda t} \right)
  • Rmax⁡R_{\max}: 획득 가능한 이론상 최대 보상 총량
  • λ\lambda: 보상 포화 속도 계수 (λ=ln⁡(2)thalf\lambda = \frac{\ln(2)}{t_{\text{half}}}, 반감기 기준)
flowchart TD
    A["유저 로그인: 오프라인 시간 t 계산"] --> B{"t <= 4시간인가?"}
    B -- "Yes" --> C["100% 전액 보상 계산"]
    B -- "No" --> D{"4시간 < t <= 12시간인가?"}
    D -- "Yes" --> E["기본 4시간(100%) + 초과분(60%) 계산"]
    D -- "No" --> F{"12시간 < t <= 24시간인가?"}
    F -- "Yes" --> G["기본(4h) + 중간(8h*0.6) + 초과분(20%) 계산"]
    F -- "No" --> H["24시간 하드캡 적용 및 초과 시간 절삭"]
    C --> I["최종 보상 확정 및 부스팅 팝업 노출"]
    E --> I
    G --> I
    H --> I

보상 감쇠와 유저 복귀(Retention)를 연결하는 4단계 UX 설계

수식만 훌륭하다고 유저가 돌아오지 않습니다. 감쇠 시스템을 유저에게 불이익(Penalty)이 아닌 보너스 회수 기회(Opportunity)로 인지시키는 UX 전략이 필수적입니다.

1단계: 게이지 시각화와 골든 윈도우(Golden Window) 제시

오프라인 보상 보관함을 ‘창고’ 형태로 시각화합니다. 0~4시간 구간은 녹색 게이지로 표시하고 감쇠가 시작되는 4시간 이후부터는 주황색, 8시간 이후는 붉은색 “창고 포화 임박” 아이콘을 노출합니다.

2단계: 로컬 푸시 알림(Local Push Notification) 타이밍 동기화

보상 감쇠가 시작되는 분기점에 맞춰 유저에게 알림을 발송합니다.

  • 발송 시점 1 (4시간 경과): “창고가 가득 차기 시작했습니다! 최고 효율 보상을 수령하세요.”
  • 발송 시점 2 (8시간 경과): “보상 획득 효율이 저하되고 있습니다. 영웅들이 보급품을 기다립니다!“

3단계: 복귀 시점의 배수 부스팅 (2x Multiplier)

접속 즉시 오프라인 보상 수령 팝업창을 띄우며 광고 시청이나 소액 유료 재화(다이아)를 사용하여 획득량을 2배로 수령할 수 있는 옵션을 제공합니다. 감쇠로 인해 약간 아쉬워진 보상량을 2배 부스팅으로 메우려는 심리를 자극하여 광고 수익(eCPM)과 잔존율을 동시에 견인합니다.

4단계: 장기 미접속자를 위한 웰컴백(Welcome Back) 소프트 랜딩

3일(72시간) 이상 미접속 유저에게는 24시간 하드캡 보상에 더해 ‘복귀 유저 환영 출석부’ 및 ‘7일간 오프라인 효율 1.5배 버프’를 지급하여 장기 이탈자의 성장 격차를 보정합니다.

오프라인 보상 수령 팝업과 2배 부스팅 및 시간 게이지 UI 예시


실전 구현: C# 기반 시간 감쇠 오프라인 보상 계산기

아래는 Unity 및 .NET 환경에서 직접 사용할 수 있는 다단계 시간 감쇠 오프라인 보상 계산기 코드입니다. 데이터 테이블 분리를 위해 각 구간 파라미터를 구조체로 정의했습니다.

using System;
using System.Collections.Generic;
using UnityEngine;

public class OfflineRewardCalculator : MonoBehaviour
{
    [System.Serializable]
    public struct DecayTier
    {
        public float durationHours; // 해당 티어의 지속 시간 (시간 단위)
        public float efficiencyRate; // 보상 효율 (1.0 = 100%, 0.5 = 50%)
    }

    [Header("Reward Settings")]
    [SerializeField] private float baseGoldPerHour = 1000f;
    [SerializeField] private float baseExpPerHour = 500f;
    [SerializeField] private float maxCapHours = 24f;

    [Header("Decay Tiers (Ordered by Time)")]
    [SerializeField] private List<DecayTier> decayTiers = new List<DecayTier>
    {
        new DecayTier { durationHours = 4f, efficiencyRate = 1.0f },  // 0~4시간: 100%
        new DecayTier { durationHours = 4f, efficiencyRate = 0.7f },  // 4~8시간: 70%
        new DecayTier { durationHours = 8f, efficiencyRate = 0.4f },  // 8~16시간: 40%
        new DecayTier { durationHours = 8f, efficiencyRate = 0.1f }   // 16~24시간: 10%
    };

    public struct RewardResult
    {
        public long Gold;
        public long Exp;
        public float EffectiveHours;
        public float TotalOfflineHours;
    }

    public RewardResult CalculateReward(DateTime lastLogoutUtc, DateTime currentLoginUtc)
    {
        TimeSpan elapsed = currentLoginUtc - lastLogoutUtc;
        if (elapsed.TotalSeconds < 0)
        {
            elapsed = TimeSpan.Zero; // 시간 역변조 방어
        }

        float totalHours = (float)elapsed.TotalHours;
        float clampedHours = Mathf.Min(totalHours, maxCapHours);

        float remainingTime = clampedHours;
        float effectiveHours = 0f;

        foreach (var tier in decayTiers)
        {
            if (remainingTime <= 0f) break;

            float timeInThisTier = Mathf.Min(remainingTime, tier.durationHours);
            effectiveHours += timeInThisTier * tier.efficiencyRate;
            remainingTime -= timeInThisTier;
        }

        RewardResult result = new RewardResult
        {
            Gold = (long)Mathf.Floor(effectiveHours * baseGoldPerHour),
            Exp = (long)Mathf.Floor(effectiveHours * baseExpPerHour),
            EffectiveHours = effectiveHours,
            TotalOfflineHours = totalHours
        };

        return result;
    }
}

자주 묻는 질문 (FAQ)

Q1. 오프라인 보상 상한(Hard Cap)은 몇 시간으로 설정하는 것이 가장 이상적인가요?

일반적으로 모바일 방치형 RPG는 12시간에서 24시간을 하드 캡으로 설정합니다. 직장인이나 학생 유저의 라이프사이클(수면 8시간 + 통학/근무 8시간)을 고려할 때 최소 8~12시간의 여유가 있어야 유저가 박탈감을 느끼지 않습니다. 하드 캡을 24시간 이상으로 늘리는 것은 VIP 시스템이나 패스(Pass) 유료 BM 혜택으로 판매하는 것이 정석입니다.

Q2. 골드, 경험치 외에 장비나 희귀 재화도 동일한 감쇠율을 적용해야 하나요?

아닙니다. 재화의 성격에 따라 분리해야 합니다. 골드와 계정 경험치 같은 기본 통화는 시간 감쇠 공식을 따르되 장비 소환권이나 다이아몬드, 강화석 같은 희귀 재화는 일일 드롭 한도(Daily Soft Cap) 또는 고정 확률 테이블을 적용해야 경제 붕괴를 막을 수 있습니다.

Q3. 유저가 기기 시간을 미래로 조작하는 치팅(Time Cheating)은 어떻게 방어하나요?

오프라인 경과 시간 계산에 절대 클라이언트 기기 로컬 시간(DateTime.Now)을 단독 사용해서는 안 됩니다. 반드시 로그인/로그아웃 시 서버 타임스탬프(UTC)를 저장 및 비교하거나 네트워크 시간 프로토콜(NTP) 서버 조회를 통해 실제 경과 시간을 검증해야 합니다.


요약 및 밸런싱 체크리스트

  1. 수식 검증: 단순 선형 공식(R=B×tR = B \times t) 대신 다단계 감쇠 또는 지수 감쇠 공식을 적용했는가?
  2. 시간대 설정: 유저 수면 및 출퇴근 시간을 배려한 4~8시간 골든 타임 구간이 존재하는가?
  3. 알림 연동: 효율 저하 시점에 맞춰 적절한 톤앤매너의 푸시 알림이 발송되는가?
  4. 수익화 연결: 복귀 시 보상 2배 부스팅(광고/BM) 동선이 자연스럽게 이어지는가?
  5. 보안 검증: 서버 타임스탬프 기반으로 시간 조작 치팅을 원천 차단했는가?