facebook twitter hatena line email

Unity/Firebase/Realtimedatabase/json

提供: 初心者エンジニアの簡易メモ
2021年9月30日 (木) 01:21時点におけるAdmin (トーク | 投稿記録)による版 (jsonの値を取得例)

(差分) ←前の版 | 最新版 (差分) | 次の版→ (差分)
移動: 案内検索

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;
    }
}

参考: https://firebase.google.com/docs/database/unity/save-data?hl=ja

jsonで受け取る

string userId = "111";
FirebaseDatabase.DefaultInstance.GetReference("user").Child(userId)
.GetValueAsync().ContinueWith(task =>
{
    if (task.IsFaulted)
    {
        Debug.LogError("not found users");
    }
    else if (task.IsCompleted)
    {
        DataSnapshot snapShot = task.Result;
        Debug.Log("json=" + snapShot.GetRawJsonValue()); // {"username":"taro", "email", "taro@example"}
    }
});

参考:https://ntw-games.net/wp/develop/363/

keyを複数含んだjsonを取得

JsonUtilityだと、Dictionaryのjsonが、取り込めないので、Newtonsoft.Json側を、使うと良い。

using Newtonsoft.Json;

FirebaseDatabase.DefaultInstance.GetReference("users")
.GetValueAsync().ContinueWith(task =>
{
    if (task.IsFaulted)
    {
        Debug.LogError("not found users");
    }
    else if (task.IsCompleted)
    {
        DataSnapshot snapShot = task.Result;
        string json = snapShot.GetRawJsonValue();
        Dictionary<string, User> dic = JsonConvert.DeserializeObject<Dictionary<string, User>>(json);
        foreach (KeyValuePair<string, User> x in dic)
        {
            Debug.Log(x.Key + ": " + x.Value.text);
        }
    }
});

User.cs

public class User
{
    public string username;
    public string email;
    public User()
    {
    }
    public User(string username, string email)
    {
        this.username = username;
        this.email = email;
    }
}

jsonの値を取得例

取得時にcallbackで、イベントを返してあげると良いが、別スレッドになってるので、メインスレッドでcallbackする。

List<User> users;
public void ExecGetUsers()
{
    var context = SynchronizationContext.Current; // メインスレッドでcontextを設置
    FirebaseDatabase.DefaultInstance.GetReference("users")
    .GetValueAsync().ContinueWith(task =>
    {
        if (task.IsFaulted)
        {
            Debug.LogError("not found users");
        }
        else if (task.IsCompleted)
        {
            DataSnapshot snapShot = task.Result;
            string json = snapShot.GetRawJsonValue();

            Dictionary<string, User> dic = JsonConvert.DeserializeObject<Dictionary<string, User>>(json);
            users = new List<User>();

            foreach (KeyValuePair<string, User> x in dic)
            {
                Debug.Log(x.Key + ": " + x.Value.text);
                users.Add(x.Value);
            }
            // メインスレッドへ戻す
            context.Post(d =>
            {
                if (callbacks != null)
                {
                    callbacks(ResponseType.Users, null);
                }
            }, null);
        }
    });
}

参考: unity/Csharp/コールバック [ショートカット]

https://light11.hatenadiary.com/entry/2021/01/07/203448