
1-1. 기본 설정
- SDk 경우 기존에 이미 다운한 상태이므로, 새로운 Json만 다운.
1-2. 유니티 설정
- Import
2-1. DatabaseReference
2-2. BackEndManager
using Firebase; using Firebase.Auth; using Firebase.Database; using Firebase.Extensions; using System.Collections; using System.Collections.Generic; using UnityEngine; public class BackendManager : MonoBehaviour { public static BackendManager Instance { get; private set; } private FirebaseApp app; public static FirebaseApp App => Instance.app; private FirebaseAuth auth; public static FirebaseAuth Auth => Instance.auth; private FirebaseDatabase database; public static FirebaseDatabase Database => Instance.database; private void Awake() { if (Instance == null) { Instance = this; DontDestroyOnLoad(gameObject); } else { Destroy(gameObject); return; } FirebaseApp.CheckAndFixDependenciesAsync().ContinueWithOnMainThread(task => { if (task.Result == DependencyStatus.Available) { // Create and hold a reference to your FirebaseApp, // where app is a Firebase.FirebaseApp property of your application class. app = FirebaseApp.DefaultInstance; auth = FirebaseAuth.DefaultInstance; database = FirebaseDatabase.DefaultInstance; database.SetPersistenceEnabled(false); // Set a flag here to indicate whether Firebase is ready to use by your app. Debug.Log("Firebase dependencies check success"); } else { Debug.LogError($"Could not resolve all Firebase dependencies: {task.Result}"); // Firebase Unity SDK is not safe to use here. app = null; auth = null; database = null; } }); } }
- using Firebase.Database 추가 및 FirebaseDataBase 변수 추가.
- Firebase는 알아서 LocalPC쪽에 최근에 불러온 data를 caching을 해둠.
-> database.SetPersistenceEnabled(false)를 해주어야, caching한 정보를 가져오지 않고, db에서 가져옴.2-3. 데이터 한번 쓰기
DatabaseReference root = BackendManager.Database.RootReference; // 기본 자료형을 통한 저장 root.Child("string").SetValueAsync("텍스트"); root.Child("long").SetValueAsync(10); root.Child("double").SetValueAsync(3.14); root.Child("bool").SetValueAsync(true); // List 자료구조를 통한 순차 저장 List<string> list = new List<string>() { "첫번째", "두번째", "세번째" }; root.Child("List").SetValueAsync(list); // Dictionary 자료구조를 통한 키&값 저장 Dictionary<string, object> dictionary = new Dictionary<string, object>() { { "stringKey", "텍스트" }, { "longKey", 10 }, { "doubleKey", 3.14 }, { "boolKey", true }, }; root.Child("Dictionary").SetValueAsync(dictionary);
- DatabaseReference 위치에 데이터를 저장하고 해당 경로의 기존 데이터를 교체 가능.
- 쓰기 작업으로 저장이 가능한 데이터 자료형은 string, long , double, bool 이 사용 가능하며, List<자료형>, Dictionary<string, 자료형>과 같이 사용이 가능한 자료형의 자료구조 또한 사용 가능.
2-4.데이터 모두 쓰기
[System.Serializable] public class UserData { public string name; public string email; public SubData subData = new SubData(); } [System.Serializable] public class SubData { public int value1; public int value2; }DatabaseReference root = BackendManager.Database.RootReference; UserData userData = new UserData(); userData.name = "Name"; userData.email = "Test@gmail.com"; userData.subData.value1 = 1; userData.subData.value2 = 2; // Json 포멧을 통한 저장 string json = JsonUtility.ToJson(userData); root.SetRawJsonValueAsync(json);
- DatabaseReference 위치에 데이터를 저장하고 해당 경로의 기존 데이터를 교체 가능.
- 쓰기 작업으로 저장하는 데이터는 json형태의 데이터를 지원.
- [System.Serializable]은 테스트해보니 없어도 db에 Write 가능.
2-5. 데이터 일부 쓰기
DatabaseReference root = BackendManager.Database.RootReference; Dictionary<string, object> dictionary = new Dictionary<string, object>(); dictionary["/name"] = "변경 이름"; dictionary["/subData/value2"] = 99; // 특정 하위 노드 변경 root.UpdateChildrenAsync(dictionary);
- DatabaseReference 위치에 다른 하위 데이터를 덮어쓰지 않고 특정 하위 노드에만 데이터 쓰기 가능.
- dictionary.Add("name", "변경 이름");
dictionary.Add("subData/value2", 99);
-> 이런식으로도 가능.2-6. 데이터 읽어 오기
DatabaseReference root = BackendManager.Database.RootReference; DatabaseReference data = root.Child("Data"); data.KeepSynced(true); data.GetValueAsync().ContinueWithOnMainThread(task => { if (task.IsFaulted) { Debug.Log("GetValueAsync encountered an error: " + task.Exception); return; } DataSnapshot snapshot = task.Result; // 하위 자식 값 불러오기 Debug.Log(snapshot.Child("Version").Value); // "1.0.1" // 하위 자식들 값 불러오기 foreach (DataSnapshot child in snapshot.Child("User").Children) { Debug.Log(child.Value); // User1, User2, User3 } // Json 포멧을 통한 불러오기 string json = snapshot.GetRawJsonValue(); Data data = JsonUtility.FromJson<Data>(json); });
- DatabaseReference 위치에 데이터를 읽기 위해 파이어베이스는 DataSnapShot을 사용.
- 작업 결과의 하위 데이터 등 해당 위치등의 모든 데이터를 포함하는 데이터.
- 특정 값 가져올때, level=int.Parse(snapshot.Child("level").Value.ToString()); 이런식으로 가능.
- 또는, 파이어베이스의 실시간 데이터베이스는 기본자료형을 long, double, string, bool을 사용하므로,
-> long level = (long)snapshot.Child("level").Value; 사용가능.- JsonUtility의 경우 Serializable 및 monobehaviour를 상속받지 않은 class만 가능!
- data.KeepSynced(true);을해주면 db에서 최근 update를 알아서 계속 가져옴. -> 다만 사용시 트래픽문제가 더 복잡할순있음, 하지만 확실하게 캐싱된값이 아닌 db에서 data를 가져오기 가능.
(또다른 예시1)
(또다른 예시2)
- 주의사항: Dictionary의 경우 JsonUtility를 사용불가능하기때문에 따로 불러오거나 작성해야함!
2-7. 데이터 트랜잭션
- 이렇게 Dictionary 형태로 저장도 가능.
-> firebase로 보면
UserData
ㄴ ID
---ㄴ_gift
------ㄴId : 32-8. 데이터 이벤트
- ValueChanged : 경로의 전체 내용에 대한 변경 확인
- ChildAdded : 경로의 하위 항목 추가 확인
- ChildChanged : 경로의 하위 항목 변경 사항을 확인
- ChildRemoved : 경로의 하위 항목 삭제를 확인
- ChildMoved : 경로의 하위 항목 순서 변경을 확인
2-9. 데이터 정렬
- OrderByChild : 지정된 하위 키의 값에 따라 결과를 정렬.
- OrderByKey() : 하위 키에 따라 결과를 정렬.
- OrderByValue() : 하위 값에 따라 결과를 정렬.
2-10. 보안 규칙
- 위에서부터 조건 체크.
-> rules의 .read와 .write가 true라면, 아래의 data들의 read write 여부상관없이 모두 읽고 쓰기가 가능.- GameData의 경우 write권한은 불가능.
- UserData의 경우 Write권한은 다른사람이 아닌 본인의 Data는 write권한 가능.
2-1.
- var userChildren = snapShot.Children.ToList();
- userChildren[i].Key.ToString() -> 아이디값들 가져옴.