「Unity/Firebase/CloudFunctions」の版間の差分
提供: 初心者エンジニアの簡易メモ
(→firebaseのサーバー側変更) |
(→サンプル) |
||
行13: | 行13: | ||
==サンプル== | ==サンプル== | ||
+ | <pre> | ||
ScoreEntry score = new ScoreEntry(); | ScoreEntry score = new ScoreEntry(); | ||
AddEntry(score); | AddEntry(score); | ||
− | + | </pre> | |
− | + | <pre> | |
− | + | using System.Threading.Tasks; | |
− | + | class ScoreEntry { | |
− | + | public string Name = "taro"; | |
− | + | public int Age = 100; | |
− | + | } | |
+ | async Task<object> AddEntryAsync(ScoreEntry score) | ||
+ | { | ||
+ | object data = new Dictionary<object, object> | ||
{ | { | ||
− | + | { "name", score.Name }, | |
+ | { "age", score.Age }, | ||
+ | }; | ||
+ | return await functions.GetHttpsCallable("addEntry").CallAsync(data) | ||
+ | .ContinueWith(task => | ||
{ | { | ||
− | + | return task.Result.Data; | |
− | + | }); | |
− | + | } | |
− | + | void AddEntry(ScoreEntry score) | |
− | + | { | |
− | + | AddEntryAsync(score).ContinueWith(task => | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
{ | { | ||
− | + | if (task.IsFaulted) | |
{ | { | ||
− | if (task.IsFaulted) | + | // onError |
− | + | } | |
− | + | else | |
− | + | { | |
− | + | // onComplete | |
+ | Debug.Log("task.Result=" + task.Result); // OK | ||
+ | } | ||
+ | }, TaskScheduler.FromCurrentSynchronizationContext()); | ||
+ | } | ||
+ | |||
+ | [Serializable] | ||
+ | class ResData | ||
+ | { | ||
+ | public string status = "ok"; | ||
+ | public string notice = ""; | ||
+ | public List<ResUser> users; | ||
+ | } | ||
+ | [Serializable] | ||
+ | class ResUser | ||
+ | { | ||
+ | public int point = 0; | ||
+ | public string name = ""; | ||
+ | } | ||
+ | void GetTopEntries() | ||
+ | { | ||
+ | GetTopEntriesAsync().ContinueWith(task => | ||
+ | { | ||
+ | if (task.IsFaulted) | ||
+ | { | ||
+ | // onError | ||
+ | } | ||
+ | else | ||
+ | { | ||
+ | // onComplete | ||
+ | string json = task.Result.ToString(); | ||
+ | Debug.Log("json=" + json); | ||
+ | ResData resData = JsonUtility.FromJson<ResData>(json); | ||
+ | Debug.Log("status=" + resData.status); | ||
+ | Debug.Log("notice=" + resData.notice); | ||
+ | foreach (ResUser user in resData.users) | ||
{ | { | ||
− | + | Debug.Log("user.name=" + user.name); | |
− | Debug.Log(" | + | Debug.Log("user.point=" + user.point); |
} | } | ||
− | }, TaskScheduler.FromCurrentSynchronizationContext()); | + | } |
− | + | }, TaskScheduler.FromCurrentSynchronizationContext()); | |
+ | } | ||
+ | </pre> | ||
==firebaseのサーバー側変更== | ==firebaseのサーバー側変更== |
2019年8月7日 (水) 01:16時点における版
準備
Gcp/Firebase/CloudFunctions [ショートカット]
import
FirebaseFunctions.unitypackage をunityのAssets/ImportPackage/CustomPackageからImportする
初期化
using Firebase.Functions; FirebaseFunctions functions = FirebaseFunctions.DefaultInstance;
東京リージョンの場合こちらを記述
using Firebase.Functions; FirebaseFunctions functions = FirebaseFunctions.GetInstance("asia-northeast1");
サンプル
ScoreEntry score = new ScoreEntry(); AddEntry(score);
using System.Threading.Tasks; class ScoreEntry { public string Name = "taro"; public int Age = 100; } async Task<object> AddEntryAsync(ScoreEntry score) { object data = new Dictionary<object, object> { { "name", score.Name }, { "age", score.Age }, }; return await functions.GetHttpsCallable("addEntry").CallAsync(data) .ContinueWith(task => { return task.Result.Data; }); } void AddEntry(ScoreEntry score) { AddEntryAsync(score).ContinueWith(task => { if (task.IsFaulted) { // onError } else { // onComplete Debug.Log("task.Result=" + task.Result); // OK } }, TaskScheduler.FromCurrentSynchronizationContext()); } [Serializable] class ResData { public string status = "ok"; public string notice = ""; public List<ResUser> users; } [Serializable] class ResUser { public int point = 0; public string name = ""; } void GetTopEntries() { GetTopEntriesAsync().ContinueWith(task => { if (task.IsFaulted) { // onError } else { // onComplete string json = task.Result.ToString(); Debug.Log("json=" + json); ResData resData = JsonUtility.FromJson<ResData>(json); Debug.Log("status=" + resData.status); Debug.Log("notice=" + resData.notice); foreach (ResUser user in resData.users) { Debug.Log("user.name=" + user.name); Debug.Log("user.point=" + user.point); } } }, TaskScheduler.FromCurrentSynchronizationContext()); }
firebaseのサーバー側変更
functions.https.onCall を使ってシリアル&認証トークンで接続するようにする
const functions = require('firebase-functions'); const admin = require('firebase-admin'); admin.initializeApp(); // 追加 exports.addEntry = functions .region('asia-northeast1') .https.onCall((data, context) => { const entry = { name : data.name, point : data.point }; return admin.firestore().collection('entries') .add(entry) .then((snapshot) => { return 'OK'; }); }); // 更新 exports.replaceEntry = functions .region('asia-northeast1') .https.onCall((data, context) => { const entry = { name : data.name, point : data.point }; return admin.firestore().collection('entries') .doc("ID1").set(entry) .then((snapshot) => { return 'OK'; }); }); // トップcount件のEntryを取得 exports.getTopEntries = functions .region('asia-northeast1') .https.onCall((data, context) => { const count = data.count; return admin.firestore().collection('entries') .orderBy('point', 'desc') .limit(count) .get() .then((snapshot) => { var obj = { status: 'ok', notice: '', users: snapshot.docs.map(x => x.data()), } var json=JSON.stringify(obj); return json; }); });
参考
https://firebase.google.com/docs/functions/callable?hl=ja
https://devlog.hassaku.blue/2019/03/unity-firebase-firebase.html
https://firebase.google.com/docs/reference/unity/class/firebase/functions/firebase-functions