2017-03-15 11 views
0

私はちょうど火の基盤を見つけました。それはまさに私が必要とするものです。現時点では、私は統一プロジェクトで実装しようとしていますが、まずそれに慣れるために少しだけテストしています。UnityのFirebaseデータベース - UIテキストへの子の値

私のデータベースにある子供の値を簡単に受け取って、ユニティプロジェクトの変数に保存する方法を教えてもらえますか?最後に、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() { 

    } 
} 

答えて

0

Firebase SDKは、非同期的に、あなたに値を返すためにタスクを使用しています。 値を取得する方法についてはthis linkをご覧ください。

Unityコルーチンの内部にいる場合は、Unityの「WaitUntil」を使用して簡単にすることもできます。 DataSnapShot.Valueを使用して解析された値を取得するか、基になるJsonを表示する場合は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()); 
} 
0

非同期操作は、基本的には、バックグラウンドで実行し、必要なときにawaitableでなければなりませんTask秒です。
あなたのテキストがSystem.Threading.Task.Task1[Firebase.Database.Datasnapshot]である理由は本当に簡単です。
GetValueAsync()を呼び出しているので、ToString()メソッドを呼び出そうとしたタイプSystem.Threading.Task<Firebase.Database.Datasnapshot>のオブジェクトを返します。これは、typenameを取得することによって発生します。あなたが結果を待ってから、ToString()を呼び出しますどのGetValueAsync()Resultを追加することができ、この問題を解決するには

例:私はすでにかなり良いと思われるUIテキストに.GetRawJsonValue()の値を表示する場合

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

あなたの本当に早い回答に感謝します。 残念ながら、Resultコマンドを含めて、私が実行しようとすると、いつも私の結束が崩れてしまいます。 提案がありますか? Asynchronousはバックグラウンド操作のためだと思うので、私の場合は正しい選択だと思いますか?そのコマンドは「値が変更された」イベントに置かれ、値を更新すると仮定します。その値はおそらく毎秒後に変更され、さらにそれらのうち8つが表示されるはずです。私はいくつかのセンサーライブを表示したい。あれについてどう思う? ありがとうございました – Cruzad0r

+0

Unityと一緒に作業するときは間違った選択だと思います。私は同期呼び出しを使用するか、データベース通信を処理するために別のスレッドを使用します。 –

+0

ええ、時々そうだと思っていましたが、それは拡張現実感とアイテム検出プログラムの一部なので、今までは一体性が必要でした。 同期呼び出しではどのように動作しますか? ありがとう – Cruzad0r

0

。データベースの変更は、統合プロジェクトで直ちに実行されます。私はちょうどそのJson Valueに参加できませんでしたか?

今のところは、以下のRawJsonが表示されます。ただ、変数Bに変数Aと「Zaehler」のChildvalueに「プログラム」のChildvalueの値を入れて

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

は動作するはずです。私はそれがかなり汚れていることを知っていますが、テストのために今すぐ動作する必要があります。だから、どうにかしてRawJsonのパーティーにアクセスできますか?

は十分に感謝することはできません。)

関連する問題