현재 PlayerDataManager의 구조가 혼재되어 있어 개선이 필요해 보여.

주요 문제점

  1. 관리자(Singleton)와 개별 인스턴스(플레이어 오브젝트)의 역할이 섞여 있음
  2. 플레이어가 파괴될 때마다 PlayerDataManager가 새로 생성됨
  3. 매니저가 아닌 객체(Player)에서 직접 데이터를 관리하고 있음

🚀 개선 방향

✔ 1. "플레이어 데이터 관리"와 "플레이어 개체 로직"을 분리


🛠 구현 방법

1️⃣ PlayerStats.cs (플레이어 오브젝트에 붙는 컴포넌트)

using System;
using UnityEngine;

public class PlayerStats : MonoBehaviour
{
    [Header("Health & Mana")]
    [SerializeField] private float maxHp = 100;
    [SerializeField] private float hp = 100;
    [SerializeField] private int maxMana = 100;
    [SerializeField] private int mana = 100;

    public event Action<float> OnHpChanged;
    public event Action<int> OnManaChanged;
    public event Action OnDie;

    public float Hp
    {
        get => hp;
        set
        {
            hp = Mathf.Clamp(value, 0, maxHp);
            OnHpChanged?.Invoke(hp);
            if (hp <= 0)
                OnDie?.Invoke();
        }
    }

    public int Mana
    {
        get => mana;
        set
        {
            mana = Mathf.Clamp(value, 0, maxMana);
            OnManaChanged?.Invoke(mana);
        }
    }

    public void TakeDamage(float damage)
    {
        if (damage <= 0) return;
        Hp -= damage;
    }

    private void Start()
    {
        OnHpChanged?.Invoke(Hp);
        OnManaChanged?.Invoke(Mana);
    }
}

개선점:


2️⃣ PlayerDataManager.cs (플레이어 데이터 저장 및 전역 관리, 싱글톤)

using UnityEngine;

public class PlayerDataManager
{
    private static PlayerDataManager _instance;
    public static PlayerDataManager Instance => _instance ??= new PlayerDataManager();

    public int PlayerLevel { get; set; } = 1;
    public int PlayerExp { get; set; } = 0;
    public int PlayerGold { get; set; } = 1000;

    private PlayerDataManager() { }

    public void SaveData()
    {
        PlayerPrefs.SetInt("PlayerLevel", PlayerLevel);
        PlayerPrefs.SetInt("PlayerExp", PlayerExp);
        PlayerPrefs.SetInt("PlayerGold", PlayerGold);
        PlayerPrefs.Save();
    }

    public void LoadData()
    {
        PlayerLevel = PlayerPrefs.GetInt("PlayerLevel", 1);
        PlayerExp = PlayerPrefs.GetInt("PlayerExp", 0);
        PlayerGold = PlayerPrefs.GetInt("PlayerGold", 1000);
    }
}