facebook twitter hatena line email

「Unity/Firebase/CloudFunctions」の版間の差分

提供: 初心者エンジニアの簡易メモ
移動: 案内検索
(サンプル)
(サンプル)
行13: 行13:
  
 
==サンプル==
 
==サンプル==
  RankingEntry ranking = new RankingEntry();
+
  ScoreEntry score = new ScoreEntry();
  AddEntry(ranking);
+
  AddEntry(score);
  
 
  using System.Threading.Tasks;
 
  using System.Threading.Tasks;
     class RankingEntry {
+
     class ScoreEntry {
 
         public string Name = "taro";
 
         public string Name = "taro";
 
         public int Age = 100;
 
         public int Age = 100;
 
     }
 
     }
     async Task<object> AddEntryAsync(RankingEntry entry)
+
     async Task<object> AddEntryAsync(ScoreEntry score)
 
     {
 
     {
 
         object data = new Dictionary<object, object>
 
         object data = new Dictionary<object, object>
 
         {
 
         {
             { "name", entry.Name },
+
             { "name", score.Name },
             { "age", entry.Age },
+
             { "age", score.Age },
 
         };
 
         };
 
         return await functions.GetHttpsCallable("addEntry").CallAsync(data)
 
         return await functions.GetHttpsCallable("addEntry").CallAsync(data)
行34: 行34:
 
             });
 
             });
 
     }
 
     }
     void AddEntry(RankingEntry entry)
+
     void AddEntry(ScoreEntry score)
 
     {
 
     {
         AddEntryAsync(entry).ContinueWith(task =>
+
         AddEntryAsync(score).ContinueWith(task =>
 
         {
 
         {
 
             if (task.IsFaulted)
 
             if (task.IsFaulted)

2019年7月26日 (金) 22:28時点における版

準備

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
           }
       }, 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';
  });
});

//  トップ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((qSnapshot) =>
  {
    return {
      entries : qSnapshot.docs.map(x => x.data())
    };
  });
});

参考

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

https://github.com/firebase/quickstart-unity/blob/master/functions/testapp/Assets/Firebase/Sample/Functions/UIHandler.cs