유니티 RPG - 28. 플레이어 데이터 로드방식 변경
Intro
플레이어의 데이터를 불러오는 방식을 다른데이터(무기,포션 데이터)를 로드하는방식과 통일시키기로했습니다.
기존 PlayerData.json 파일에는 플레이어의 스탯(hp,mp 등)만 있었지만, 앞으로 플레이어의 인벤토리 정보나 위치등과같은
다양한 데이터를 저장시켜놓아야하므로 항목을 나누어 저장하기로 했습니다.
PlayerData.json
우선 기존에 있던 정보를 Status 배열에 넣어주었습니다.
다른 데이터정보를 저장하고자할때는 새로운 배열을 만들어주면됩니다.
{
"Status": [
{
"maxHp": 1000.0,
"curHp": 1000.0,
"maxMp": 1000.0,
"curMp": 1000.0,
"speed": 3.0,
"rotateSpeed": 10.0
}
]
}
PlayerDataDTO
PlayerDataDTO 클래스는 플레이어 데이터의 직렬화/역직렬화를 위한 클래스입니다.
[System.Serializable]
public class PlayerDataDTO
{
public List<StatusDTO> Status;
[System.Serializable]
// 스탯 정보
public class StatusDTO
{
public float maxHp; // 최대체력
public float curHp; // 현재체력
public float maxMp; // 최대마나
public float curMp; // 현재마나
public float speed; // 이동속도
public float rotateSpeed; // 회전속도
}
}
Status 배열을 위한 클래스인 StatusDTO 를 만들어주었습니다.
그리고 StatusDTO 객체를 저장할 Status 리스트가 있습니다.
PlayerData
PlayerData 클래스의 생성자에서 StatusDTO를 받아서 초기화합니다.
Status가 아닌 다른 데이터를 받아 초기화하기위해서는 생성자를 오버라이딩하여 초기화합니다.
public class PlayerData
{
[SerializeField] private float maxHp;
[SerializeField] private float curHp;
[SerializeField] private float maxMp;
[SerializeField] private float curMp;
[SerializeField] private float speed;
[SerializeField] private float rotateSpeed;
public float MaxHp => maxHp;
public float CurHp => curHp;
public float MaxMp => maxMp;
public float CurMp => curMp;
public float Speed => speed;
public float RotateSpeed => rotateSpeed;
// 생성자 - Status 초기화
public PlayerData(PlayerDataDTO.StatusDTO dto)
{
this.maxHp = dto.maxHp;
this.curHp = dto.curHp;
this.maxMp = dto.maxMp;
this.curMp = dto.curMp;
this.speed = dto.speed;
this.rotateSpeed = dto.rotateSpeed;
}
}
DataManager
DataManager 에서 플레이어 데이터를 읽어오는방식이 변경되었습니다.
private PlayerData playerData;
// 플레이어 데이터 불러오기
private PlayerData LoadPlayerData()
{
if(File.Exists(playerDataPath))
{
string jsonData = File.ReadAllText(playerDataPath);
var playerDTO = JsonConvert.DeserializeObject<PlayerDataDTO>(jsonData);
if(playerDTO != null && playerDTO.Status != null)
{
PlayerData playerData = new PlayerData(playerDTO.Status[0]);
return playerData;
}
else
{
Debug.LogWarning("PlayerData.json 파일에 Status 배열이 비어있음");
return default(PlayerData);
}
}
else
{
Debug.LogWarning("PlayerData.json 파일이 없음.");
return default(PlayerData);
}
}
댓글남기기