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 자체라는 것을 설정
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에 접근하기 위해서 사용
public static DataManager Instance
{
get
{
if(null==instance)
{
return null;
}
return instance;
}
}
DataManger Instance는 poroperty이다.
property는 get / set 가지고 있는 속성이다.
property인 Instance를 사용하여 다른 클래스에서 접근할 수 있다.
다만, 현재 위 코드 (2)의 instance는 원래라면 다른 클래스에서 접근할 수 없는데, (1)에서 전역변수로 설정했기 때문에 불러올 수 있는 상태이다.