Unity中的Firebase数据库 - 将子值转换为UI文本

时间:2017-03-15 11:03:35

标签: c# unity3d firebase firebase-realtime-database

我刚刚遇到火场,那似乎正是我所需要的。目前我正在尝试在我的团结项目中实现它,但首先我只是测试一下以适应它。

有人能告诉我如何轻松地在我的数据库中接收孩子的价值并将其保存在我的团结项目的变量中吗?最后,我想在UI文本中显示值。它不需要真正的动态。越容易越好,所以我一定能理解它。

尝试如下:

variableXY.text = FirebaseDatabase.DefaultInstance.GetReference ("Databasename").Child ("Childname").GetValueAsync ().ToString ();

结果是,它显示文本: System.Threading.Task.Task1 [Firebase.Database.Datasnapshot]

只需要价值。

如果有人可以帮助我,我将非常感激

非常感谢!

现在就显示我的完整代码,这可能会让事情变得更清晰。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using Firebase;
using Firebase.Database;
using Firebase.Unity.Editor;

public class DBManager: MonoBehaviour {

    public Text MA1Sensor1;
    public Text MA1Sensor2;

    void Start() {


        // Set up the Editor before calling into the realtime database.
        FirebaseApp.DefaultInstance.SetEditorDatabaseUrl("https://unityar-6eb13.firebaseio.com/");

        // Get the root reference location of the database.
        DatabaseReference reference = FirebaseDatabase.DefaultInstance.RootReference;
        FirebaseDatabase.DefaultInstance
            .GetReference("MA1")
            .ValueChanged += HandleValueChanged;

    }

    void HandleValueChanged(object sender, ValueChangedEventArgs args) {
        if (args.DatabaseError != null) {
            Debug.LogError(args.DatabaseError.Message);
            return;
        }

        Debug.Log (args.Snapshot.GetRawJsonValue());
        MA1Sensor1.text = FirebaseDatabase
            .DefaultInstance
            .GetReference ("MA1")
            .Child ("Zaehler")
            .GetValueAsync ()
            //.Result
            .ToString ();
        Debug.Log (MA1Sensor1.text);

    }


    // Update is called once per frame
    void Update () {

    }
}

3 个答案:

答案 0 :(得分:0)

异步操作基本上是Task s,它应该在后台运行并在需要时等待 您的文字System.Threading.Task.Task1[Firebase.Database.Datasnapshot]的原因非常简单 由于您正在调用GetValueAsync(),因此它会返回您尝试调用System.Threading.Task<Firebase.Database.Datasnapshot>方法的ToString()类型的对象,这会导致获取typename。

要解决此问题,您可以在等待结果的Result之后添加GetValueAsync(),然后拨打ToString()

示例:

variableXY.text = FirebaseDatabase
                  .DefaultInstance
                  .GetReference ("Databasename")
                  .Child ("Childname")
                  .GetValueAsync ()
                  .Result // wait for the result of asynchronous operation
                  .ToString ();

答案 1 :(得分:0)

如果我在UI Text中显示.GetRawJsonValue()的值似乎已经相当不错了。数据库中的更改将立即在unity项目中完成。难道我不能参与Json Value的一部分吗?

现在它显示以下RawJson:

{"Program":1,"Zaehler":600}

只需将&#34; Program&#34; Childvalue的值放入变量A和&#34; Zaehler&#34;将Childvalue变为变量B即可。我知道它很脏,但是为了测试它只需要立即工作。那么,我能不能以某种方式访问​​RawJson的一方?

不够感恩;)

答案 2 :(得分:0)

Firebase SDK使用“任务”以异步方式向您返回值。 查看有关如何检索值的this link

如果您在Unity协程内部使其更简单,您也可以使用Unity的“WaitUntil”。请注意,如果要查看基础Json,可以使用DataSnapShot.Value获取解析值或GetRawJsonValue()。在大多数简单的场景中,您需要Value。如果你使用的是类型对象和Unity的Json序列化,你可以使用“GetRawJsonValue()”。

var getTask = FirebaseDatabase
   .DefaultInstance
   .GetReference ("MA1")
   .Child ("Zaehler") .GetValueAsync();

yield return new WaitUntil(() => getTask.IsCompleted || getTask.IsFaulted);

if (getTask.IsCompleted) {
  Debug.Log(getTask.Result.Value.ToString());
}