現在、FirebaseのFirestoreを使用してプレイヤーのデータをクラウドで保存しようとしています。
こちらの公式ページを参考に進めているのですが、GetSnapshotAsync()
の非同期処理のところで躓いています。
##環境
・Unity 2020.1.17f1
・Visual Studio 2019
・Firebase SDKのdotnet4内のFirebaseFirestore.unitypackageとFirebaseAuth.unitypackageをインストール
・PUN 2を導入
Unity自体は初心者ではないのですが、async/awaitをあまり使ったことがありません(初心者ー中級者の間くらい?)。
FirebaseはRealtime databaseを少し使ったことがあるレベルです。
##コードとエラー
公式ページには以下のようなコードが書かれており、プロジェクトにあるスクリプトのIEnumerator
メソッドに貼り付けました。
C#
1DocumentReference docRef = db.Collection("cities").Document("SF"); 2DocumentSnapshot snapshot = await docRef.GetSnapshotAsync(); 3if (snapshot.Exists) 4{ 5 Console.WriteLine("Document data for {0} document:", snapshot.Id); 6 Dictionary<string, object> city = snapshot.ToDictionary(); 7 foreach (KeyValuePair<string, object> pair in city) 8 { 9 Console.WriteLine("{0}: {1}", pair.Key, pair.Value); 10 } 11} 12else 13{ 14 Console.WriteLine("Document {0} does not exist!", snapshot.Id); 15}
コード二行目で以下のようなエラーが発生します。
await演算子は非同期メソッド内でのみ使用できます。このメソッドをasync修飾子でマークし、戻り値の型をTask<Ienumerator>に変更することを検討してください。
###やってみたこと1
言われたとおりに以下のようにコードを変更してみても別のエラーエラーが発生します。
private async Task<Ienumerator> GetDocu() { DocumentReference docRef = db.Collection("cities").Document("SF"); DocumentSnapshot snapshot = await docRef.GetSnapshotAsync(); if (snapshot.Exists) { ...... }
上記コードTask<Ienumerator>
の部分で
型 Task<T>がUnity.Tasks, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null と netstandard, Version=2.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 の両方に存在します。
GetDocu()
の部分で
機能 非同期ストリームはC# 7.3では使用できません。8.0以上の言語バージョンをお使いください。
エラーを見た感じそもそもこのような使い方はUnity 2020ではできないように思います。
#やってみたこと2
以下のようにしてやってみました。
C#
1private void GetDocu() 2{ 3 4 DocumentReference docRef = db.Collection("cities").Document("SF"); 5 // DocumentSnapshot snapshot = await docRef.GetSnapshotAsync(); 6 DocumentSnapshot snapshot = docRef.GetSnapshotAsync(); 7 if (snapshot.Exists) 8 { 9 10 ...... 11 12}
・async
修飾子を消去
・Task<IEnumerator>
からvoid
に変更
・await
を消去
コンパイルエラーは起きなくなりましたが、GetDocu()
が呼ばれたタイミングでUnityエディターがフリーズしました。
そもそもUnityを使用して実装しているのに、最新のC#を想定したコードを参考にするのも悪い気がしますが、
これ以上どのように修正すればいいのか思いつきません...
FirestoreはまだUnity向けには公開されたばかりなので日本語の情報がほぼないので...
Firebaseのリアルタイムデータベースを使うのも手だとは思うのですが。
どなたかFirebaseや非同期処理に慣れている方回答お願いします。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。