🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Firebase

Firebaseは、Googleが提供するBasSサービスの一つ。リアルタイム通知可能、並びにアクセス制御ができるオブジェクトデータベース機能を備えます。さらに認証機能、アプリケーションのログ解析機能などの利用も可能です。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

非同期処理

非同期処理とは一部のコードを別々のスレッドで実行させる手法です。アプリケーションのパフォーマンスを向上させる目的でこの手法を用います。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

1回答

2232閲覧

FirebaseのFirestoreでasync/awaitでコンパイルエラー | Unity

Yukirr4_

総合スコア728

Firebase

Firebaseは、Googleが提供するBasSサービスの一つ。リアルタイム通知可能、並びにアクセス制御ができるオブジェクトデータベース機能を備えます。さらに認証機能、アプリケーションのログ解析機能などの利用も可能です。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

非同期処理

非同期処理とは一部のコードを別々のスレッドで実行させる手法です。アプリケーションのパフォーマンスを向上させる目的でこの手法を用います。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2021/03/18 06:11

現在、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や非同期処理に慣れている方回答お願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

GetDocu()は何もreturnしないので以下のようにasync voidにします。

cs

1private async void GetDocu() 2{ 3 // ... 4}

更にGetDocu()を呼ぶ側で終了を待ちたい場合はasync Taskにします。

cs

1private async Task GetDocu() 2{ 3 // ... 4} 5 6private async void Start() 7{ 8 // GetDocu()を呼ぶ側 9 await GetDocu(); 10 //後続処理 11}

async/awaitはC#の機能なのでUnityのコルーチンと互換性がないので注意してください。
また、UniTaskを導入するとTaskとコルーチンを相互変換できるのでおすすめです。

投稿2021/03/20 10:35

shiena

総合スコア1827

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問