2020年3月11日水曜日

(作成アクション) Umbrella_GoogleSheets_Action

Googleのスプレッドシートを利用しての、データの読み書きを試してみたいと思い
あれこれ、探していますと、何やらすごそうなものを見つけました。

Unity+Googleスプレッドシート+GASでサーバーレスのデータベースシステムを実現する? - Qiita

こちらに掲載されていて、Githubに公開されている「Umbrella」という アセットです。
作者は@Totorock氏。詳細は、リンク先を御覧ください。
デモを見ればわかるように、基本的に、Player自身のステータスのセーブ、ロード、範囲を指定
してのセルの読み出しといったことを、簡単に行えるツールです。

今回は、このアセットをPlayMaker から使用するための、カスタムアクションを作ってみました。
PlayMaker のステート内のGUI上で、項目や値を指定し、スプレッドシートの内容の読み書き
ができます。「Umbrella」本体には手を加えません。

* 「Umbrella」のデモ等を使ってみた事を前提に説明します。
スプレッドシートやGAS ( Google Apps Script ) の初歩的な知識もいりますが、ネット上で
さらっと覚えられる程度のものだと思います。スクリプトを書く必要はありません。

プレイヤーとの送受信で、スプレッドシートの以下のようなデータを、やり取りするイメージ
です。プレイヤーには固有の[ userID ]が作られ、自分の行(横一列)の項目(キー)の内容を
読み書きします。またセルを指定しての(A2:B5 等) 内容の読み込みもできます。


既に「Umbrella」をインポートしてある状態のプロジェクトに、配布パッケージを
インポートします。
(注、 「Umbrella」は当環境で、unity2018.2.6f1では動作せず、2019.3.3f1では動きました。
それに伴い、PlayMaker も、バージョン 1.9.0.p20 に更新しています。)

Umbrella_GoogleSheets_Action_v1.1

更新履歴
2020/03/29    v1.1 遅延処理。フィニッシュ_イベント選択、追加。
2020/03/11    v1.0 公開

----------------------------------------------------------

配布パッケージをインポートします。(Projectにドロップで可)
すると[PlayMaker Custom Actions] 内に [@sakusei] フォルダができ、以下の5つの
アクションが追加されます。


アクションブラウザには、カテゴリ 「@sakusei」 が作られ、中に5つのアクションが
選択可能な状態で並んでいると思います。(図では以前のものも入ってます)

(カテゴリは、スクリプト内の [ActionCategory] で変更できます)  

[Umbrella_G Sheets_write]      指定した項目(key)に値(atai)を書き込みます。
[Umbrella_G Sheets_read]         指定した項目(key)から値(atai)を読み込みます。
[Umbrella_G Sheets_read_Range]  セルの指定した範囲の値(atai)を読み込みます。
[Umbrella_User id_sakuzo]      自動作成された固有のユーザーIDを削除します。
[Umbrella_User id_settei]       本来、固有のユーザーIDが設定される部分(Useaid)
                                                 に任意の文字を設定します。 

----------------------------------------------------------

Umbrella の DatabaseManeger をシーン内に置き、



スプレッドシート側で設定した、「Databaseスクリプト」 の 公開URLと使用するシート名を
記入します。シーン内ではMainCamera に PlayMaker のFSM(状態遷移を)をつけています。


----------------------------------------------------------

スプレッドシート上の構成。

1列目userid は、はじめて書き込むときに自動で生成され、PlayerPrefsに[ userid ]として
セーブされます。その後、読み書きの個人識別に使われます。
一行目の項目(キー)は、セルにはじめから用意しても良いですし、送信されてきたときに存在して
いなければ、新たに追加されます。


アクションを一つづつ使用してみます。
[ Umbrella_G Sheets_write ] 
シートにデータを書き込みます
対象キーと、書き込む値をペアで入力(変数も可)し送信します。複数ペアの入力が可能です。
ユーザーIDが上図の「盆と正月」のものなので、これを実行すると


「盆と正月」のメッセージとスコアが上書きされます。

----------------------------------------------------------

 [ Umbrella_G Sheets_read ]
シートからデータを読み込みます。
対象キーを入力(変数も可)し送信します。複数入力が可能です。
それぞれに、格納する変数を指定します。All_Results はすべての受信値の一覧です。
(設定しなくても可)


変数の[ インスペクタ ]表示をチェックして実行すると、図のようインスペクタで確認できます。
プレイヤー名とスコア、ステータスが受信できてますね。

----------------------------------------------------------

 [ Umbrella_G Sheets_read_Range ]
 シートの範囲を指定して、データを読み込みます。C2、E4はセルの、列、行の指定です。
格納には、それぞれ対応した変数を設定して指定します。


シートで見れば図のような範囲

実行すると、このようになります。値はそれぞれ、用意した配列に収まります。


 注) この、Umbrella_G Sheets_read_Range は範囲が空欄、もしくは未設定の場合、エラー警告
が出てそのまま実行するとエラーになります。(ステート停止)
入力されていても、定形外文字等の場合はエラーになります。使用する際にご注意を。

----------------------------------------------------------

[ Umbrella_User id_sakuzo ] 
保存されている、ユーザーID ( userid ) を削除します。


今の状態で実行すると、ローカルに保存されている、5番目のユーザーIDが削除され、
もう「盆と正月」のデータを上書きすることは、できなくなりました。
新たに書き込むと、新しいIDが自動生成され、別プレイヤーとして書き込むことになります。


----------------------------------------------------------

[ Umbrella_User id_settei ]
ユーザーID ( userid ) に、任意の文字を設定します。 
これは何かというと、ユーザーIDが自動生成される前に、 自分で好きなIDを作りを保存
しようというものです。こんな感じ。



更にこのようにアクションを並べて実行すると、


ユーザーID、新しい行で、値を書き込むことができました。

 
これ何になるの?と、自分でもはっきりしていないのですが、
予めこんな風なテーブルでも作って、 データの読み書きができれば、面白い使いみちも
あるんじゃないかなぁ…などと思ってしまったのですな。

----------------------------------------------------------

通信エラーの場合、ステートは停止せず、スルーされます。

Umbrella はエラー時にデバッグログに、エラー通知を出すのですが、プレイ画面にも
通知を出せたらいいなと使用時には一工夫してみました。といっても簡単で、C#のスクリプト
からシーン内にあるPlayMakerのFSM(状態遷移)全体へ

PlayMakerFSM.BroadcastEvent ("送信エラーですね");

のような一文で、イベントを送ることができます。(個別は少し面倒、参照
そして、このように、グローバルイベントとして受け取ることができます。
GSSDataHub.cs 内にエラー通知のDebug.Log出力があります。

----------------------------------------------------------

このアクションは、「Umbrella」及び、Googleスプレッドシート側の、仕様変更等により
動作しなくなる可能性があります。

今のところ、スプレッドシートのレスポンスは必ずしも機敏ではないので、ガシガシ間をおかず
やり取りするような使い方には向かないと思います。ですが、ピンポイントのデータのやり取りで
世界観を共有するようなこと、ができそうな気はします。
何にせよ、基本無償でデータサーバのようなことができてしまうのだから、Google様はスゴイ
ですね、ほんと。もちろん、それを使えるようにするアセット作る人もスゴイです。


今後の課題?予定?妄想?感想?等
シートの指定は、出来たのだなぁ。
アクション内で、ネットワークエラーは取れないか。ランキングのアクションもあればよいかな
需要ないかな。 etc...

他所様のツールのアクションを作る場合、原則、本体には手を加えないようにします。

0 件のコメント:

コメントを投稿