[#3-7. Script Review] 우주 정복 프로젝트

Maengkkong·2023년 11월 27일

DataManager 활용법

DataManager를 통해 데이터를 관리하여 다른 class에서 해당 데이터를 가져올 수 있다. 이 DataManger는 instance = this;를 사용하여 instance를 DataManager로 설정해준다.

instance를 사용하지 않는다면, (1) 하나의 기능을 가져올 때마다 class를 새로 만들어 기능을 가져와야 한다는 단점 (2) 한번에 수정할 수 없음 (3) 지속적인 새로운 class 생성으로 값이 다르게 되는 경우, 오류 및 관리의 어려움이 있다.


(example)
MonsterController

public class MonsterController : MonoBehaviour
{
    [SerializeField]
    private float _monsterMoveSpeed;

    void Start()
    {
        //DataManager를 통해 MonsterData.json의 해당 몬스터 speed 값을 가져온다.
        _monsterMoveSpeed = DataManager.instance.monsterDataList[_monsterIndex].speed;
    }

public class DataManager : MonoBehaviour
{
	//(1)
    public static DataManager instance = null;

    public List<PlayerStatData> playerStatDataList;
    public PlayData playData;
    public AchieveData achieveData;
    public List<MonsterData> monsterDataList;
    public List<UpgradeData> upgradeDataList;
    public List<RoundData> roundDataList;
	
    //(2)
    private void Awake()
    {
        if (instance == null)
        {
            instance = this;
            DontDestroyOnLoad(gameObject);
        }
        else if (instance != this.gameObject)
            Destroy(gameObject);

        //리스트 할당
        playerStatDataList = new List<PlayerStatData>();
        playData = new PlayData();
        achieveData = new AchieveData();
        monsterDataList = new List<MonsterData>();
        upgradeDataList = new List<UpgradeData>();
        roundDataList = new List<RoundData>();


        PlayerPrefs.SetInt("Gold",30000);
        //1일 경우 플레이 기록이 존재 , 0일 경우 처음 플레이
        LoadFromResourcesData();
    }
    
    //(3)
    //dataManager 인스턴스
    public static DataManager Instance
    {
        get // 다른 곳에서 instance 값을 가져올 때 사용
        {
            if(null==instance)
            {
                return null;
            }
            return instance;
        }
    }

    //데이터 세팅
    private void LoadFromResourcesData()
    {
        //캐릭터 스탯 데이터
        TextAsset _playerdata = Resources.Load("PlayerStatData", typeof(TextAsset)) as TextAsset;
        playerStatDataList = JsonConvert.DeserializeObject<List<PlayerStatData>>(_playerdata.ToString());
        }

(1) public static DataManager instance = null;를 통해 선언

(2) instance = this를 통해 이 instance가 DataManager 자체라는 것을 설정

  • List는 private void Awake(){}안에 있기 때문에, property인 Instance 사용하여 다른 클래스에서 사용할 수 있다.
private void Awake()
    {
        if (instance == null)
        {
            instance = this;
            DontDestroyOnLoad(gameObject);
        }
        else if (instance != this.gameObject)
            Destroy(gameObject);

        //리스트 할당
        playerStatDataList = new List<PlayerStatData>();
        playData = new PlayData();
        achieveData = new AchieveData();
        monsterDataList = new List<MonsterData>();
        upgradeDataList = new List<UpgradeData>();
        roundDataList = new List<RoundData>();


        PlayerPrefs.SetInt("Gold",30000);
        //1일 경우 플레이 기록이 존재 , 0일 경우 처음 플레이
        LoadFromResourcesData();
    }

(3) 다른 class에 접근하기 위해서 사용

  • (1), (2)를 설정한 후 (3) 생성
 public static DataManager Instance
    {
        get
        {
            if(null==instance)
            {
                return null;
            }
            return instance;
        }
    }

DataManger Instance는 poroperty이다.
property는 get / set 가지고 있는 속성이다.

  • get : 다른 곳에서 instance의 값을 가져올 때 사용한다.
  • set : 다른 곳에서 instance의 값을 세팅할 때 사용한다.

property인 Instance를 사용하여 다른 클래스에서 접근할 수 있다.

다만, 현재 위 코드 (2)의 instance는 원래라면 다른 클래스에서 접근할 수 없는데, (1)에서 전역변수로 설정했기 때문에 불러올 수 있는 상태이다.

0개의 댓글