[ 비동기 처리 ]

Firebase는 데이터를 읽고 쓸때 비동기 방식으로 작동한다.

 ~> 비동기 처리란 특정 Logic의 실행이 끝날때까지 기다려주지 않고 나머지 코드를 먼저 실행하는 것을 말한다.

 

[ 해결 방법 ]

using Firebase.Extensions; 추가시 ContinueWithOnMainThread() 사용이 가능하다.

 ~> using Firebase.Extensions; 은 Unity의 기본 Thread에서 연속 기능을 실행할 수 있도록 하는

      System.Threading.Tasks.Task 및 System.Threading.Tasks.Task < T >에 대한 확장 메서드이다.

 ~> ContinueWith 사용시 Unity의 Main Thread가 아닌 Background Thread가 사용된다.

 

+ 참고 사이트

https://8trian8.tistory.com/47

https://firebase.google.com/docs/reference/unity/class/firebase/extensions/task-extension

'Additional Study > Firebase' 카테고리의 다른 글

[Firebase #1] Unity와 Firebase의 연동  (0) 2024.02.04

 

 

 

 

 

[ Unity 프로젝트 생성 ]

1. 새로운 프로젝트 생성후 [ FIle ] - [ Build Settings... ] 에서 Platform을 Android 선택 후 Switch Platform

 

2. [ FIle ] - [ Build Settings... ] - [ Player Settings... ] - [ Other Settings ] - [ Identification ] 의 Package Name 설정

    (Package Name의 형식은 "com.CompanyName.ProductName" 이며, 숫자로 시작 X, 알파벳과 "_"만 사용 가능하다.)

 

 

 

 

 

[ Firebase 프로젝트 추가 ]

1. 우선 Firebase 사이트에 접속한다. (https://firebase.google.com/?hl=ko)

 

Firebase | Google’s Mobile and Web App Development Platform

개발자가 사용자가 좋아할 만한 앱과 게임을 빌드하도록 지원하는 Google의 모바일 및 웹 앱 개발 플랫폼인 Firebase에 대해 알아보세요.

firebase.google.com

2. [ 시작하기 ] - [ 프로젝트 추가 ]

 

3. [ 프로젝트 이름 ] 입력

 

4. [ 이 프로젝트에서 Google 애널리틱스 사용 설정 ] 체크 - [ 계속 ]

 

5. 계정이 없을 경우 Default Account for Firebase를 선택한다. (새 계정을 만드는 것 추천)

 

6. FIrebase에 Unity 앱을 추가한다.

 

7. Unity 프로젝트의 Package Name으로 앱을 등록한다.

 

8. 구성 파일 다운로드 후 Unity 프로젝트의 Assets 폴더에 넣는다.

 

9. google-services.json 파일의 "project_info" 부분에 "firebase_url" : "Firebase의 url"을 추가로 입력해준다.

 

10. Firebase의 SDK를 다운로드한 뒤 편리한 위치에 압축을 푼다. 

 

11. Unity Project 창의 [ Assets ] - [ 오른쪽 마우스 ] - [ import Package ] - [ Custom Package... ] 

 

12 . 압축 해제한 폴더에서 FirebaseDatabase.unitypackage 를 가져온뒤 import 한다.

 

13. Unity로 돌아와서 [ Enable ] 클릭 (오류는 IOS 앱 등록을 안 해서 발생하는데 전혀 상관 X)

 

 

 

 

[ 데이터 저장 ]

1. 우선 [ 빌드 ] - [ Realtime Database ] - [ 데이터베이스 만들기 ] 를 통해 Realtime Database를 만든다.

 

2. 데이터베이스의 위치를 선택한다.

 

3. 테이터베이스 보안 규칙을 작성한 뒤 [ 사용 설정 ] 클릭

 

4. 데이터 저장 Test를 위해 Unity로 돌아와 [ Hierarcy ] - [ 오른쪽 마우스 ] - [ Create Empty ] 를 통해 빈 오브젝트 생성 후

    다음과 같은 Script를 Component로 추가한다.

 

데이터 저장 Test를 위한 FirebaseTest Script 생성
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Firebase;
using Firebase.Database;
public class FirebaseTest : MonoBehaviour
{
    DatabaseReference dbReference;

    void Start()
    {
        dbReference = FirebaseDatabase.DefaultInstance.RootReference;

        dbReference.Child("users").Child("username").SetValueAsync("YS");
    }
}

 

5. Realtime Database에서 데이터 저장이 잘 되었는지 확인한다.

 

+ 또 다른 데이터 저장 방법 (https://firebase.google.com/docs/database/unity/save-data?hl=ko)

형식이 지정된 C# 객체를 데이터로 저장하고 싶은 경우
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Firebase;
using Firebase.Database;
public class Test : MonoBehaviour
{
    DatabaseReference dbReference;

    void Start()
    {
        dbReference = FirebaseDatabase.DefaultInstance.RootReference;

        AddNewUser("1", "YS", "1234@naver.com");
    }

    void AddNewUser(string userId, string name, string email)
    {
        User user = new User(name, email);
        string json = JsonUtility.ToJson(user); // 형식이 지정된 C# 객체를 사용시 객체를 원시 JSON으로 변환

        dbReference.Child("users").Child(userId).SetRawJsonValueAsync(json); // 지정된 위치에서 하위 노드를 포함하여 모든 데이터를 덮어쓴다.
        dbReference.Child("users").Child(userId).Child("username").SetValueAsync("JY"); // 전체 객체를 다시 쓰지 않고 하위 항목을 업데이트 하는 방법
    }
}​

 

 

 

[ 데이터 불러오기 ]

1. 현재 Realtime Database에 아래와 같은 데이터들이 있다.

 

2. 데이터를 불러오기 위해 Script를 다음과 같이 수정한다.

데이터를 불러오기 위한 FirebaseTest Script 수정
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Firebase;
using Firebase.Database;
public class Test : MonoBehaviour
{
    DatabaseReference dbReference;

    void Start()
    {
        dbReference = FirebaseDatabase.DefaultInstance.RootReference;

        LoadUserInfo();
    }

    void LoadUserInfo()
    {
        dbReference.Child("users").GetValueAsync().ContinueWith(task =>
        {
            if (task.IsCanceled)
                Debug.Log("로드 취소");
            else if (task.IsFaulted)
                Debug.Log("로드 실패");
            else
            {
                var dataSnapshot = task.Result;

                foreach (var data in dataSnapshot.Children)
                    foreach (var child in data.Children)
                        Debug.Log(data.Key + " : " + child.Key + " : " + child.Value);
            }
        });
    }
}​

 

3. Console 창을 통해 데이터를 정상적으로 불러왔는지 확인한다.

 

 

 

[ 메서드 참고 ]

 

 

'Additional Study > Firebase' 카테고리의 다른 글

[Firebase #2] Firebase의 비동기 처리  (0) 2024.03.01

+ Recent posts