부트캠프/Unity [ 스파르타 ]

[스파르타 ][TIL] 유니티 스파르타 7기 47일차 - 보상리워드

맏난거 2025. 4. 16. 22:02

✅ IdleRewardManager 클래스 예시

using System;
using UnityEngine;

public class IdleRewardManager : MonoBehaviour
{
    private const string LastLogoutKey = "LastLogoutTime";
    private const float GoldPerSecond = 1f; // 초당 획득 골드량

    public Action<int> OnRewardCalculated;

    private void Start()
    {
        CalculateIdleReward();
    }

    private void OnApplicationPause(bool pause)
    {
        if (pause)
        {
            SaveLogoutTime();
        }
    }

    private void OnApplicationQuit()
    {
        SaveLogoutTime();
    }

    private void SaveLogoutTime()
    {
        string nowStr = DateTime.Now.ToString();
        PlayerPrefs.SetString(LastLogoutKey, nowStr);
        PlayerPrefs.Save();
        Debug.Log($"로그아웃 시간 저장됨: {nowStr}");
    }

    private void CalculateIdleReward()
    {
        string savedTimeStr = PlayerPrefs.GetString(LastLogoutKey, string.Empty);
        if (string.IsNullOrEmpty(savedTimeStr))
        {
            Debug.Log("처음 실행이거나 이전 시간 없음");
            return;
        }

        DateTime lastTime = DateTime.Parse(savedTimeStr);
        TimeSpan idleTime = DateTime.Now - lastTime;

        int reward = Mathf.FloorToInt((float)idleTime.TotalSeconds * GoldPerSecond);
        Debug.Log($"방치 시간: {idleTime.TotalSeconds:F1}초, 보상 골드: {reward}");

        // 외부에서 이 값으로 UI나 보상 시스템 작동 가능
        OnRewardCalculated?.Invoke(reward);
    }
}

🧩 클래스 사용 예시

public class RewardUI : MonoBehaviour
{
    public IdleRewardManager rewardManager;

    private void Start()
    {
        rewardManager.OnRewardCalculated += ShowRewardPopup;
    }

    private void ShowRewardPopup(int gold)
    {
        if (gold > 0)
        {
            Debug.Log($"방치 보상으로 골드 {gold} 획득!");
            // UI 팝업 띄우기 가능
        }
    }
}

📌 장점

  • 확장성 있음: 골드 말고도 경험치, 아이템 등 다양하게 확장 가능
  • 구조 분리: UI는 보상 로직과 분리되어 깔끔함
  • 오프라인 시간 기반: 실제로 게임이 돌지 않아도 보상 제공 가능