現在Unityでゲームを作っており、Firebaseを使ってデータの管理をしようと考えています。
実際にデータの登録はできる状態で、取得するところで詰まっています。
登録したデータを呼び出すのに、以下のコードを使用しています。
あるタイミングでGetValue()を実行し、非同期でGetIntOfInformationを呼び出し、代入しています。
C#
1 int i = 0; 2 void GetValue(string path) 3 { 4 i = GetIntOfInformation(path); 5 Debug.Log(i); 6 } 7 8 public int GetIntOfInformation(string path) 9 { 10 int num = 0; 11 FirebaseDatabase.DefaultInstance 12 .Child("Information") 13 .Child(path) 14 .GetValueAsync().ContinueWith(task => 15 { 16 if (task.IsFaulted) 17 { 18 Debug.Log("Faulted"); 19 } 20 else if (task.IsCompleted) 21 { 22 snapshot = task.Result; 23 num = int.Parse(snapshot.ToString()); 24 } 25 }); 26 27 return num; 28 }
しかしこのやり方だと、非同期で値をサーバーから取得している間にGetValueの流れは終わってしまい、結果0のままです。
実際にコード中の**num = int.Perse(snapshot.ToString())**の下にデバッグを入れるとサーバーに保存されている数値が表示されるので間違ってはいないと思います。
**GetValue()**の流れを、numに値が入って戻り値となるまで止めることはできるのでしょうか。
##追記
**num = int.Perse(snapshot.ToString())の下とかにGotValue(num)**なんて付けて、
C#
1 void GotValue(int i) 2 { 3 Debug.Log(i); 4 }
こんな風にしたら楽なんですけど、取得したい値のキーはこれだけじゃなくて、汎用性がなくなっちゃうので、非同期処理を待つようなことはできないか知りたいです。
##追記2
####例外 Input string was not in a correct format. が発生する件について
C#
1 void Start() 2 { 3 Invoke("GetVal", 5); 4 } 5 6 private async void GetVal() 7 { 8 int getScore = await FirebaseController.GetIntOfInformation("Score"); 9 Debug.Log("Score"); //ここでスコアを取得したい 10 } 11 12 public async Task<int> GetIntOfInformation(string name) 13 { 14 try 15 { 16 var snapshot = await FirebaseDatabase.DefaultInstance 17 .GetReference("USERS") 18 .Child(id) //ユーザー識別(FirebaseAuthment)で取得したユーザーid 19 .Child("Information") 20 .Child(name) 21 .GetValueAsync().ConfigureAwait(false); 22 23 return int.Parse(snapshot.ToString()); 24 } 25 catch (Exception exception) 26 { 27 Debug.LogError(exception); 28 return 0; 29 } 30 31 }
このコードで**Debug.LogError(exception);**が常に呼び出されてしまいます。
Firebaseコンソール上では __USERS/"ユーザーid"/Information/Score__に値が入っています。
ちなみに、例外処理が起きるということは戻る数値も正しくないのでエラーにしちゃったほうがいいですよね?
(適当な数字を戻して上書きしてしまったりするのを防ぐにはエラーにする以外あるのでしょうか。)
######エラー(例外)内容
System.FormatException: Input string was not in a correct format.
at System.Number.StringToNumber (System.String str, System.Globalization.NumberStyles options, System.Number+NumberBuffer& number, System.Globalization.NumberFormatInfo info, System.Boolean parseDecimal) [0x00057] in <567df3e0919241ba98db88bec4c6696f>:0
at System.Number.ParseInt32 (System.String s, System.Globalization.NumberStyles style, System.Globalization.NumberFormatInfo info) [0x00013] in <567df3e0919241ba98db88bec4c6696f>:0
at System.Int32.Parse (System.String s) [0x00007] in <567df3e0919241ba98db88bec4c6696f>:0
at FirebaseController+<GetIntOfInformation>d__10.MoveNext () [0x000cd] in C:\Users\users\UnityProjects\project\Assets\FirebaseController.cs:133
UnityEngine.Debug:LogError(Object)
<GetIntOfInformation>d__10:MoveNext() (at C:/Users/user/UnityProjects/TestProject/Assets/FirebaseController.cs:137)
System.Threading.Tasks.TaskCompletionSource1:SetResult(DataSnapshot) Firebase.Database.<WrapInternalDataSnapshotTask>c__AnonStorey0:<>m__0(Task
1) (at Z:/tmp/tmp.hapPVC8cw6/firebase/database/client/unity/proxy/Query.cs:139)
System.Threading._ThreadPoolWaitCallback:PerformWaitCallback()
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/03/17 07:17
2020/03/17 08:04
2020/03/17 08:30
2020/03/17 08:56 編集
2020/03/17 10:00
2020/03/19 13:51 編集
2020/03/21 09:16
2020/03/21 12:03
2020/03/21 12:12
2020/03/21 12:24
2020/03/22 01:37 編集
2020/03/22 01:58
2020/03/22 14:20 編集
2020/03/23 03:30
2020/03/23 08:20 編集
2020/03/23 08:28 編集
2020/03/23 08:27
2020/03/23 08:28