파파비의 블로그
Unity, 유니티 - Firestore에서 data 가져오기 본문
검색해보니 Firestore 관련 코드가 제대로 설명된게 없어서
정리해서 올려보고자 한다.
먼저
Unity에서 Firestore를 사용하기 위해선
1) Firebase project와 연결이 되어 있어야하고
2) Unity Project에 firestore sdk를 넣어두어야 한다.
위 2개의 과정은 다른 곳에서 찾아보면 참으로 많아 생략하고 핵심만 얘기하고자 한다.
코드
using System.Collections.Generic;
using UnityEngine;
using Firebase.Firestore;
public class Playlist : MonoBehaviour
{
// Start is called before the first frame update
async void Start ()
{
FirebaseFirestore db = FirebaseFirestore.DefaultInstance;
CollectionReference playlistref = db.Collection("playlist");
QuerySnapshot snapshot = await playlistref.GetSnapshotAsync();
foreach (DocumentSnapshot document in snapshot.Documents)
{
Dictionary<string, object> documentDictionary = document.ToDictionary();
Debug.Log("title: " + documentDictionary["title"] as string);
if (documentDictionary.ContainsKey("description"))
{
Debug.Log("link: " + documentDictionary["link"] as string);
}
Debug.Log("available: " + documentDictionary["available"] as string);
Debug.Log("time: " + documentDictionary["time"] as string);
}
}
}
여기에 모든 핵심이 다 들어 있다.
1. 먼저 firebase firestore 객체에 연결을 해야 한다.
>> 인터넷에 찾아보니 firebaseDB, firebase.firestore. ~ 뭐 이런식으로 firestore객체를 받으라고 하는데
2020년 10월 기준으로 했을 땐,
다 저런 것들은 없었고,
FirebaseFirestore 이라는 객체를 통해 가져올 수 있었다.
>> FirebaseFirestore 객체는, unity 프로젝트내에 연결된 firebase 프로젝트의 firestore 관련 객체로 연결된다.
2. db.collection("컬렉션이름") 은 firestore 내에 컬렉션을 가져오게 되는데,
컬렉션이름은 여기 위에 보이는 것처럼, 컬렉션 시작 부분 아래에 있는 녀석의 이름을 넣어주면
그와 관련된 모든 문서들을 얻을 수 있다.
참고로 코드 2번째 줄의
CollectionReference playlistref = db.Collection("playlist");
이 부분은, 컬렉션 중에, playlist 컬렉션을 가르킨다는 의미를 전달한 것일 뿐,
실제로 firestore과 연락을 취한 것은 아니다.
3번째 줄에,
QuerySnapshot snapshot = await playlistref.GetSnapshotAsync();
이 부분에서, 저 주소에 대해서 data들을(snapshot들) 가져오라고 서버에 요청을 하게 되는 것인데,
"비동기"로 실시되어 await가 앞에 붙어 있음을 알 수 있다.
(await에 대해서 잘 모르시는 분들을 위해 간단하게 설명하자면, 저렇게 서버에서 데이터를 달라는 행위 같은 것들은
통신상황이나, 서버 상황에 따라 위에서 아래로 코드를 실행하게 되면, 대기를 오래 할 수도 있기 때문에,
따로 처리시키고 다음부분을 진행하게 된다. 이걸 비동기 프로그래밍이라고 하는데,
거기에 await를 붙이게 되면, 저 비동기처리가 완료된 후에, 나머지 코드를 실행하라는 뜻이 된다.
참고로 await를 메소드 내에서 사용하기 위해선 앞에 async를 붙여줘야 한다. 그래서 start 메소드 앞에도 async가 붙어있다. )
여기보면 playlist 컬렉션에는 1개의 문서가 있다. 여러 개 있다면 snapshot 객체에는 여러 개의 문서가 있었을 것이다.
각 문서에는 위 이미지처럼 key:value 형식의 data를 가지고 있다.
Foreach문을 보면, 우리가 받은 컬렉션에서 .document라는 속성을 통해 각 문서들에 접근 할 수 있음을 알 수 있다.
여기서 C#은 각 문서를 dictionary로 받을 수 있다. 각 문서에 대해 .todictionary를 통해 바꿔주면 수월하게 데이터를 처리할 수 있다.
코드에서는 단순히 log를 찍어주고 있지만, 다양한 오브젝트들을 만들어서 사용할 수 있다.