오늘의 학습 키워드

static 클래스

 

공부한 내용

MonoBehaviour를 상속받은 static 클래스 vs static 클래스

문제 : SceneManager.LoadScene으로 게임을 재시작했을 때 static 클래스인 WeaponManager의 다음 판에도 데이터가 계속 남아 있어 문제가 되었다.

public class WeaponManager
{
    private static WeaponManager _instance;
    public static WeaponManager Instance { get => GetInstance(); }

    public List<UpgradeItem> WeaponPrefabs { get; private set; }
    public List<WeaponData> WeaponDatas { get; private set; } = new List<WeaponData>();

    [Header("Resource Path")]
    private const string ITEM_UI_PATH = "UI/Weapons/";

    public event Action<WeaponData> WeaponUpgradeEvent;

    private static WeaponManager GetInstance()
    {
        if (_instance == null)
            _instance = new WeaponManager();

        return _instance;
    }
}

원인으로 생각한 것 : SceneManager.LoadScene으로 게임을 다시 시작했을 때 MonoBehaviour를 상속 받은 GameManager 싱글턴의 데이터는 초기화 되는 것으로 보아 싱글턴을 여러 곳에서 관리 하는 것에서 문제가 생긴다고 생각했다.

해결 방안 : WeaponManager의 싱글턴을 제거한 후 GameManager 싱글턴이 WeaponManager까지 관리를 해서 게임을 재시작 할 때 GameManager 싱글턴이 파괴되어 WeaponManager까지 파괴될 수 있도록 했습니다.

public class GameManager : MonoBehaviour
{
    public static GameManager instance;

    private WeaponManager _weapon;
    public WeaponManager Weapon { get => GetInstance(ref _weapon); }

    private void Awake()
    {
        instance = this;
    }

    public T GetInstance<T>(ref T t) where T : new()
    {
        if (t == null)
            t = new T();

        return t;
    }
}

 

 

오늘의 회고

 오늘은 저번 주부터 진행한 팀 프로젝트를 마무리하고 발표하는 날이었다. 추석 연휴가 껴있어서 일정 맞추기도 어렵고 짬짬이 구현을 해야했지만 기한이 다가올수록 팀원들이 많이 도와주어서 급한 순서대로 작업을 잘 쳐낼 수 있었다. 다음엔 리팩토링도 신경써서 잘 해봐야겠다.

 내일은 새로운 것을 공부할텐데 기대가 된다. 열심히 잘 해봐야겠다. 내일도 파이팅!

+ Recent posts