데이터베이스에서 데이터를 불러오는 것 또한, 파이어베이스 SDK에서 제공하는 라이브러리를 이용하여 구현했습니다.
Save와 마찬가지로 파이어베이스 매니저에서 그 기능을 담당하고 있으며,
데이터를 오브젝트화 하여, Save했던 것을 반대로.
DB에서 가져온 데이터를 역오브젝트화하여, UserClass 데이터에 세팅하는 과정을 거칩니다.
DB의 로드는 씬 매니저에서 호출되는 ChangeSceneManaging() 함수에서 이뤄집니다.
즉, 씬 전환마다 DB와 연결하여 데이터를 받아오게 됩니다.
이렇게 호출된 ChangeSceneManaging() 함수는 아래와 같습니다.
유저가 로그인 상태가 아니라면, 데이터를 받아오지 않고. 로그인 상태일 경우만 DB를 받도록 합니다.
LoadUserData()는 실제로 데이터를 로드하는 기능 함수입니다.
Save파트에서 User데이터를 각 변수마다, 분리하여 저장하였기때문에.
Load 역시, 분리된 User 데이터를 따로따로 접근하여 가져와야 합니다.
유저 정보를 저장하고 있는 가장 가까운 부모인 UserData에 접근한 snapshot을 변수로 넘기고, 각 변수마다 설정된 DB 접근 후, 유저 정보 세팅 함수를 호출합니다.
파이어 베이스의 DB에는 데이터가 key와 value 형식으로 저장되어 있으며, value는 object로써 저장되어 있습니다.
그렇기에, 스냅샷(UserData 노드)의 Value를 가져온 후에, key값을 비교하는 방식으로 자식 객체의 데이터에 접근할 수 있습니다.
유저 캐릭터 데이터를 불러오는 함수이기에, 'userCharacter'를 킷값으로 입력하여 데이터를 가져오고 Dictionary<string, object> 형식으로 저장하면 됩니다.
이렇게 가공한 데이터(딕셔너리)를 기존의 UserCharacter 데이터에 덧씌우는 방식으로 구현합니다.
SetFromDictionary() 함수는 Save 파트에서 구현했던 ToDictionary() 함수의 역기능 버전입니다.
즉, 오브젝트로 가공된 데이터를 각 클래스가 요구하는 변수로 변환하는 함수입니다.
착용 무기 데이터 정보를 Load하는 함수입니다.
로직의 흐름은 위에서 설명했던 것과 동일합니다.
착용 장비(성유믈)의 경우에는 ItemClass[] 형태로 저장되어 있으며,
If문을 이용하여 자식 노드의 저장 상태에 따라서 분기하여 오브젝트를 Get할 수 있도록 하였습니다.
List<object> 혹은 Dictionary<string,object> 형으로 저장되어 있는 DB 객체를, 읽어들여 데이터의 하위노드까지 들어간 후, 노드의 키와 값을 Dictionary 형태로 변환하여 역오브젝트화 하는 구조로 구현했습니다.
각 아이템 리스트를 Save에서 한번에 일괄처리했던 것처럼, Load 역시 하나의 함수로 묶어서 불러오기합니다.
다만, 여기서는 데이터의 구조가 아래와 같은 점을 유의하며 순차적으로 접근하여 벗겨내야 합니다.
List<object> -> Dictionary<string, object>
리스트는 각 아이템의 번호입니니다.
예를 들어, 검1, 검2가 존재할 때.
List<object>에 검1과 검2가 원소로 저장되고.
검1과 검2의 세부 데이터는 Dictionary<string, object>에 저장되는 구조입니다.
위의 코드는 그런 구조에 차례대로 접근한 뒤, 데이터를 딕셔너리로 묶어서 역오브젝트화 후, ItemList에 저장하는 형태입니다.
복잡한 데이터로 저장된 오브젝트가 아닌, 단순 자료형으로 저장된 객체는 상단의 함수로 일괄처리하여 유저 데이터를 세팅합니다.
LoadSimpleData() 함수는 제네릭으로 정의되어 있어, 다양한 데이터 타입에 대해 사용될 수 있습니다. nodeName으로 지정된 노드의 데이터를 onDataLoaded 콜백을 통해 로드해, 종료를 알립니다.
파이어베이스의 데이터는 Key-Value로 저장되어 있습니다.
그렇기에 데이터를 오브젝트화할 때, 클래스 내의 변수들을 키와 값으로 나누어 오브젝트화하여, Json으로 가공하여 전송하게 됩니다.
그렇기에 DB의 데이터를 다시 전송받을 때도, 이러한 과정을 거치게 됩니다.
오브젝트로 받은 데이터를 Dictionary<string, object>로 인스턴스화하고 매개변수로 넘겨서, 해당 객체의 SetFromDictionary() 함수를 통해서, 킷값에 해당하는 값을 초기화해주는 것입니다.
캐릭터 클래스 객체의 데이터를 저장한 딕셔너리를 받아서, 킷값을 대조. 각 킷값에 해당하는 데이터를 변수에 할당해주는 함수입니다.
상단의 코드는 아이템 클래스의 데이터를 저장한 딕셔너리를 받아서, 킷값을 대조하여 값을 초기화하는 함수입니다.