현재 PlayerDataManager의 구조가 혼재되어 있어 개선이 필요해 보여.
주요 문제점
PlayerDataManager는 이름상 데이터를 관리하는 매니저처럼 보이지만, 실질적으로는 플레이어의 체력, 마나, 공격 등 개별 플레이어의 상태 및 기능을 직접 처리하고 있음.Managers의 PlayerData는 싱글톤 매니저를 관리하는 것처럼 보이는데, 이게 씬 이동 시 파괴되는 플레이어와 연결되어 있어서 불안정한 접근 방식이 됨.PlayerDataManager가 새로 생성됨
Managers가 PlayerDataManager를 싱글톤으로 접근하려고 하지만, 실제 PlayerDataManager는 플레이어 오브젝트에 부착됨.PlayerDataManager도 파괴됨 → 싱글톤의 의미가 없어짐.PlayerDataManager는 체력(Hp), 마나(Mana), 무적(Invincibility), 공격(OnAttacked) 등 플레이어 개별 인스턴스의 상태를 다룸.✔ 1. "플레이어 데이터 관리"와 "플레이어 개체 로직"을 분리
PlayerDataManager → PlayerStats(플레이어 상태 관리 컴포넌트)
PlayerDataManager → 모든 플레이어 데이터(저장된 값, 전역 관리)를 담당하는 싱글톤 매니저
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);
}
}
✅ 개선점:
PlayerStats는 개별 플레이어 상태를 관리함 (플레이어의 체력, 마나, 공격 관련 기능)Managers에서 싱글톤으로 관리하지 않음 → 씬 이동 시 자동으로 새롭게 생성됨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);
}
}