「Unity/Firebase/Realtimedatabase」の版間の差分
提供: 初心者エンジニアの簡易メモ
(→サンプル) |
(→keyを生成) |
||
行198: | 行198: | ||
userに存在しないキーを生成 | userに存在しないキーを生成 | ||
string key = FirebaseDatabase.DefaultInstance.GetReference("user").Push().Key; | string key = FirebaseDatabase.DefaultInstance.GetReference("user").Push().Key; | ||
+ | |||
+ | ==リスト== | ||
+ | 追加、更新、削除を検知 | ||
+ | <pre> | ||
+ | using UnityEngine; | ||
+ | using UnityEngine.UI; | ||
+ | using Firebase.Database; | ||
+ | using System.Collections.Generic; | ||
+ | using System; | ||
+ | |||
+ | public class SampleScene : MonoBehaviour | ||
+ | { | ||
+ | void Start() | ||
+ | { | ||
+ | DatabaseReference userReference = FirebaseDatabase.DefaultInstance.GetReference("user"); | ||
+ | userReference.ChildAdded += HandleChildAdded; | ||
+ | userReference.ChildChanged += HandleChildChanged; | ||
+ | userReference.ChildRemoved += HandleChildRemoved; | ||
+ | |||
+ | InputField input = GameObject.Find("/Canvas/InputField").GetComponent<InputField>(); | ||
+ | GameObject.Find("AddButton").GetComponent<Button>().onClick.AddListener(delegate { | ||
+ | AddUser(input.text); | ||
+ | }); | ||
+ | } | ||
+ | // 受信 追加された時 | ||
+ | void HandleChildAdded(object sender, ChildChangedEventArgs args) | ||
+ | { | ||
+ | if (args.DatabaseError != null) | ||
+ | { | ||
+ | Debug.LogError(args.DatabaseError.Message); | ||
+ | return; | ||
+ | } | ||
+ | string json = args.Snapshot.GetRawJsonValue(); | ||
+ | Debug.Log("HandleChildAdded=" + json); // {"email":"ttt@example","username":"ttt"} | ||
+ | |||
+ | User user = JsonUtility.FromJson<User>(json); | ||
+ | Debug.Log("HandleChildAdded username=" + user.username); | ||
+ | } | ||
+ | // 受信 更新された時 | ||
+ | void HandleChildChanged(object sender, ChildChangedEventArgs args) | ||
+ | { | ||
+ | if (args.DatabaseError != null) | ||
+ | { | ||
+ | Debug.LogError(args.DatabaseError.Message); | ||
+ | return; | ||
+ | } | ||
+ | string json = args.Snapshot.GetRawJsonValue(); | ||
+ | Debug.Log("HandleChildChanged=" + json); // {"email":"ttt@example","username":"ttt"} | ||
+ | |||
+ | User user = JsonUtility.FromJson<User>(json); | ||
+ | Debug.Log("HandleChildChanged username=" + user.username); | ||
+ | } | ||
+ | // 受信 削除された時 | ||
+ | void HandleChildRemoved(object sender, ChildChangedEventArgs args) | ||
+ | { | ||
+ | if (args.DatabaseError != null) | ||
+ | { | ||
+ | Debug.LogError(args.DatabaseError.Message); | ||
+ | return; | ||
+ | } | ||
+ | string json = args.Snapshot.GetRawJsonValue(); | ||
+ | Debug.Log("HandleChildRemoved=" + json); // {"email":"ttt@example","username":"ttt"} | ||
+ | |||
+ | User user = JsonUtility.FromJson<User>(json); | ||
+ | Debug.Log("HandleChildRemoved username=" + user.username); | ||
+ | } | ||
+ | void AddUser(string name) | ||
+ | { | ||
+ | User user = new User(name, name + "@example"); | ||
+ | string json = JsonUtility.ToJson(user); // {"email":"ttt@example","username":"ttt"} | ||
+ | // userに存在しないキーを生成 | ||
+ | // FirebaseDatabase.DefaultInstance.GetReference("user").Push().Key; | ||
+ | #if Unity_EDITOR | ||
+ | string userId = "pc"; | ||
+ | #elif UNITY_ANDROID | ||
+ | string userId = "android"; | ||
+ | #elif UNITY_IPHONE | ||
+ | string userId = "iphone"; | ||
+ | #endif | ||
+ | FirebaseDatabase.DefaultInstance.GetReference("user").Child(userId) | ||
+ | .SetRawJsonValueAsync(json); | ||
+ | } | ||
+ | } | ||
+ | </pre> | ||
==参考== | ==参考== | ||
https://firebase.google.com/docs/database/unity/save-data?hl=ja | https://firebase.google.com/docs/database/unity/save-data?hl=ja |
2021年9月19日 (日) 10:01時点における版
目次
Realtimedatabaseのインストール
FirebaseDatabase.unitypackageをAssets/Importからインストールする
https://firebase.google.com/download/unity?hl=ja
料金課金周り
Gcp/Firebase/RealtimeDatabase [ショートカット]
ルール
以下のようなルールになってると、更新できないので、test時は修正後のように 修正前
{ "rules": { ".read": false, ".write": false } }
修正後
{ "rules": { ".read": true, ".write": true } }
サンプル
SampleScene.cs
using System.Collections; using System.Collections.Generic; using UnityEngine; using Firebase; using Firebase.Database; using Firebase.Unity.Editor; public class SampleScene : MonoBehaviour { void Start() { // Get the root reference location of the database. DatabaseReference reference = FirebaseDatabase.DefaultInstance.RootReference; // 書き込み FirebaseDatabase.DefaultInstance.GetReference("users") .Child("name") .SetValueAsync("taro"); // 読み込み FirebaseDatabase.DefaultInstance.GetReference("users") .Child("name") .GetValueAsync().ContinueWithOnMainThread(task => { if (task.IsFaulted) { Debug.LogError("not found users"); } else if (task.IsCompleted) { DataSnapshot snapShot = task.Result; Debug.Log(snapShot.Value); } }); } }
参考:https://firebase.google.com/docs/database/unity/retrieve-data?hl=ja
参考:http://siguma-sig.hatenablog.com/entry/2018/09/30/213822
json更新
FirebaseDatabase.DefaultInstance.GetReference("users")
.Child("name") .SetRawJsonValueAsync("{'name': 'taro','age' : 25}");
変更があったら呼び出し
public class SampleScene : MonoBehaviour { void Start() { // Get the root reference location of the database. DatabaseReference reference = FirebaseDatabase.DefaultInstance.RootReference; // 変更があったら呼び出し FirebaseDatabase.DefaultInstance.GetReference("user") .Child("name").ValueChanged += HandleNameValueChanged; // 書き込み FirebaseDatabase.DefaultInstance.GetReference("user") .Child("name") .SetValueAsync("taro"); } private void HandleNameValueChanged(object sender, ValueChangedEventArgs args) { if (args.DatabaseError != null) { Debug.LogError(args.DatabaseError.Message); return; } Debug.Log("HandleNameValueChanged=" + args.Snapshot.Value); } }
テキストフィールドから送信して、別テキストで受信するまで
- UIからInputFieldを選択し、/Canvas/InputFieldを作成
- UIからTextを選択し、/Canvas/CommonTextを作成
- 以下csを用意する。
入力したテキストが、別端末の同アプリにリアルタイムに表示されるれば成功。
サンプル
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; using Firebase; using Firebase.Database; using Firebase.Unity.Editor; public class SampleScene : MonoBehaviour { DatabaseReference reference; void Start() { reference = FirebaseDatabase.DefaultInstance.RootReference; FirebaseDatabase.DefaultInstance.GetReference("user") .Child("name").ValueChanged += HandleNameValueChanged; InputField input = GameObject.Find("/Canvas/InputField").GetComponent<InputField>(); input.onValueChanged.AddListener(OnValueChanged); } // 受信 void HandleNameValueChanged(object sender, ValueChangedEventArgs args) { if (args.DatabaseError != null) { Debug.LogError(args.DatabaseError.Message); return; } Debug.Log("HandleNameValueChanged=" + args.Snapshot.Value.ToString()); GameObject.Find("/Canvas/CommonText").GetComponent<Text>().text = args.Snapshot.Value.ToString(); } // 送信 void SetName(string name) { Debug.Log("SetName=" + name); FirebaseDatabase.DefaultInstance.GetReference("user") .Child("name") .SetValueAsync(name); } // テキスト変更イベント void OnValueChanged(string value) { Debug.Log("OnValueChanged=" + value); SetName(value); } }
階層
/で区切ったり、
.Child("na/me")
Childでつなげたり。
.Child("na").Child("me")
jsonをそのまま送信
User user = new User("taro", "taro@example"); string json = JsonUtility.ToJson(user); string userId = "111"; FirebaseDatabase.DefaultInstance.GetReference("user").Child(userId) .SetRawJsonValueAsync(json);
User.cs
public class User { public string username; public string email; public User(string username, string email) { this.username = username; this.email = email; } }
keyを生成
userに存在しないキーを生成
string key = FirebaseDatabase.DefaultInstance.GetReference("user").Push().Key;
リスト
追加、更新、削除を検知
using UnityEngine; using UnityEngine.UI; using Firebase.Database; using System.Collections.Generic; using System; public class SampleScene : MonoBehaviour { void Start() { DatabaseReference userReference = FirebaseDatabase.DefaultInstance.GetReference("user"); userReference.ChildAdded += HandleChildAdded; userReference.ChildChanged += HandleChildChanged; userReference.ChildRemoved += HandleChildRemoved; InputField input = GameObject.Find("/Canvas/InputField").GetComponent<InputField>(); GameObject.Find("AddButton").GetComponent<Button>().onClick.AddListener(delegate { AddUser(input.text); }); } // 受信 追加された時 void HandleChildAdded(object sender, ChildChangedEventArgs args) { if (args.DatabaseError != null) { Debug.LogError(args.DatabaseError.Message); return; } string json = args.Snapshot.GetRawJsonValue(); Debug.Log("HandleChildAdded=" + json); // {"email":"ttt@example","username":"ttt"} User user = JsonUtility.FromJson<User>(json); Debug.Log("HandleChildAdded username=" + user.username); } // 受信 更新された時 void HandleChildChanged(object sender, ChildChangedEventArgs args) { if (args.DatabaseError != null) { Debug.LogError(args.DatabaseError.Message); return; } string json = args.Snapshot.GetRawJsonValue(); Debug.Log("HandleChildChanged=" + json); // {"email":"ttt@example","username":"ttt"} User user = JsonUtility.FromJson<User>(json); Debug.Log("HandleChildChanged username=" + user.username); } // 受信 削除された時 void HandleChildRemoved(object sender, ChildChangedEventArgs args) { if (args.DatabaseError != null) { Debug.LogError(args.DatabaseError.Message); return; } string json = args.Snapshot.GetRawJsonValue(); Debug.Log("HandleChildRemoved=" + json); // {"email":"ttt@example","username":"ttt"} User user = JsonUtility.FromJson<User>(json); Debug.Log("HandleChildRemoved username=" + user.username); } void AddUser(string name) { User user = new User(name, name + "@example"); string json = JsonUtility.ToJson(user); // {"email":"ttt@example","username":"ttt"} // userに存在しないキーを生成 // FirebaseDatabase.DefaultInstance.GetReference("user").Push().Key; #if Unity_EDITOR string userId = "pc"; #elif UNITY_ANDROID string userId = "android"; #elif UNITY_IPHONE string userId = "iphone"; #endif FirebaseDatabase.DefaultInstance.GetReference("user").Child(userId) .SetRawJsonValueAsync(json); } }
参考
https://firebase.google.com/docs/database/unity/save-data?hl=ja