Resources나 File에서 비동기로 로드하는 방법으로 모두 변경 완료하였다.
IEnumerator PlaceDBSet() //TODO : 이 구문 자체는 게임 시작할 때 들어가야됨.
{
yield return loadingwait;
var placeDB = Resources.LoadAsync<TextAsset>("PlaceDB");
yield return placeDB;
if (placeDB == null)
{
Debug.Log("파일이 없습니다 : DataManager 203");
yield break;
}
var place = placeDB.asset as TextAsset;
string placeData = place.text;
PlaceDBDatas = JsonConvert.DeserializeObject<PlaceDBDatas>(placeData);
}
리소스 폴더에서 로딩할 때는 json파일을 불러오는 것으로 TextAsset 형태로 불러와야한다.
로딩을 대기한 후 파일 존재 여부를 체크하여 있다면 TextAsset.text를 받아서 역직렬화 한다.
IEnumerator QuestSet() //TODO : 개인 플레이 데이터 불러오는 부분이니까 분리하고 비동기로 작업하기. + 이어하기 버튼에 연결
{
var readAllTextAsync = File.ReadAllTextAsync(path + "/save.json");
yield return readAllTextAsync.Result;
string questData = readAllTextAsync.Result;
_questDic = JsonConvert.DeserializeObject<Dialogue_Quest_Dic>(questData);
}
File에서 비동기로 읽어올 때, 이미 Text를 읽어오기 때문에 타입을 따로 지정해줄 필요는 없으나, 읽어오는 것을 대기할 때 그 데이터의 Result를 대기해야한다.
물론 여기서도 파일이 존재하는 지 먼저 예외처리를 해주는 것이 좋다.
어제 생각했던 데로 아이템이나 도감 등 다른 부분들을 정리하여 데이터를 불러오는 부분에는 에러가 없도록 수정하였다.
로딩씬 자체는 사실 의미가 없긴하여 현재 건드리지 않고 로딩완료 시 넘어가도록 설정해놓았다.
map 리소스 작업이 모두 끝나서 PlaceDB를 새로 정비했다.
public enum Map_Type {Change, Unchange}
public class PlaceDB
{
public int Place_ID; //Index
public string Place_Name; // 이름
public string Place_BG_Path; // Resources.Load에 사용할 주소값
public string Place_OBJ_Path;
public Map_Type MapType;
}
시간대에 따라 맵을 따로 사용해야 되는 경우도 있어서 enum으로 변경할 것인지 아닌지 체크하고, 배경 이미지 파일의 이름과 오브젝트용 프리팹의 이름을 분리했다.
장소들의 인덱스에 관한 부분은 사전형 자료로 만드는 작업이 추가적으로 필요하다.
현재는 배치될 오브젝트들의 프리팹이 없어서 배경을 바꾸는 작업만 진행됬다.
오브젝트들을 미리 배치하는 방법은 두 가지 생각해보았다.
로딩할 때 미리 프리팹들을 모두 불러와서 세팅하고, 게임 씬으로 넘어가서 부모 오브젝트를 변경한다.
게임 씬으로 넘어가서 세팅하고 그 동안 화면을 잠시 가려놓는다.
원래는 2번으로 하려고 했으나, 방법을 알고나니 1번이 더 좋을 듯하여 그렇게 작업할 예정이다.
배경을 바꾸는 메서드는
public void CanvasChange() //결국 방 이동하는 것도 캔버스 체인지인가?
{
PlaceDB NextPlaceData = new PlaceDB();
//CanvasGroup[playerinformation.position].SetActive(false); //현재 캔버스 끄기.
foreach (var VARIABLE in DataManager.Instance.PlaceDBDatas.PlaceDB)
{
if (VARIABLE.Place_ID == playerinformation.position)
{
NextPlaceData = VARIABLE; //TODO : dic으로 바꾸긴해야함.
}
}
if (NextPlaceData.MapType == Map_Type.Change)
{
Debug.Log($"{BGFilePath}/{NextPlaceData.Place_BG_Path}_{playerinformation.dayTime.ToString()}");
bgImage.sprite = Resources.Load<Sprite>($"{BGFilePath}/{NextPlaceData.Place_BG_Path}_{playerinformation.dayTime.ToString()}");
}
else
{
bgImage.sprite = Resources.Load<Sprite>($"{BGFilePath}/{NextPlaceData.Place_BG_Path}");
}
}
현재는 for문으로 place를 찾고있지만 사전형으로 바꿀 예정이며, 현재 있는 PlaceData를 바탕으로 맵을 가져오게 될 것이다.