2020年3月31日火曜日

Umbrella_GoogleSheets_ranking_sample

前記事
Umbrella_GoogleSheets_オンライン_ランキングシステム

のUmbrella_GSRanking_Action_v1.1 に含まれている
サンプルシーン「Umbrellaランキングサンプルv1.1」 を説明します。

実行するとこのように。
スクリーンサイズは540x540で作ってました。

機能は見たままで、「名前」「スコア」を入力し、『決定』ボタンを押すとグーグル
シートに送信され、順位リストが返ってきて表示されます。
(入力した「スコア」が 、ローカルにセーブされた(ハイスコア)を更新していない
と、送信されません。)


『ランキングリスト取得』ボタンは、順位リストが取得、表示のみです。

------------------------------
オブジェ構成はこのように。
Canvas に テキストやボタン。emp は空オブジェで、それぞれにPlayMakerの状態遷移
を付けています。


RankingManager のインスペクタにある[ RankingSettings ]を設定します。


順位は10位までで、DESC、降順(値の大きい順)にします。

------------------------------
「emp 決定_送信」の状態遷移です。
右が、送信してリスト受信で、左がリスト受信と表示なのですが 、もともと2つのオブジェ
に別の状態遷移として分割していたのです。

が、共通のグローバル変数の別環境(配布先ですね)へのインポートがどうも安定しない
のでローカルのみで動作するように合体させました。ステートがちょっと多いですが、
一つ一つ見ていけば、単純な作業の積み重ねだとわかるはずです。


 これで、自身のハイスコアを更新したときのみの送信、通信時に変化するはずの
値を参照して、通信が成功しているかどうかの判断、をしています。

------------------------------
もう一つ「emp ID_ハイスコア削除」の状態遷移です。

ローカルに保存している、Userid を削除。ハイスコアを、"0" に設定します。
『ユーザーID+ハイスコア削除』 ボタンを押すと、ハイスコア のリセットされた
新ユーザーとして、スコアを送信できます。

------------------------------
[ RankingSettings ]を変更したり、ステートやアクションを変化させてみたり、
あれこれ、してみても面白いかもしれません。手軽にトライ&エラーができるのが
ビジュアルスクリプトのいいところです。


2020年3月30日月曜日

(作成アクション) Umbrella_GoogleSheets_オンライン_ランキングシステム

前回、「(作成アクション) Umbrella_GoogleSheets_Action 」の続編になります。

 「Umbrella」では、おまけ、ということですが、Googleのスプレッドシートを利用しての、
オンラインランキングの機能があり、それをPlayMakerから使用するためのカスタム
アクションになります。

間を開けると、色々忘れてしまうであろうことから、流れで作っておくことにしました()

「Umbrella」本体、そのデータセーブのPMアクション等のことについての、前回の記事
「(作成アクション) Umbrella_GoogleSheets_Action 」を、一読の上お読みください。

プレイヤーは固有の[ userID ] で識別され、「名前」と「スコア」をスプレッドシートへ送信し
記録されます。同時に、設定した順位内のリスト(名前、スコア)を、取得します。
「Umbrella」付属のデモシーン参照。


オンラインランキングのシステムは、他にも色々あるようですが、 「Umbrella」もシンプル、
簡潔で使いやすいんじゃないかなぁ。ゲーム内に取り込んで表示したいというなら特に。

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

Umbrella_GSRanking_Action_v1.1

更新履歴

2020/03/31    v1.1 公開

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

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


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

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

[ Umbrella GS Ranking_write ] スコアを書き込んで、設定した順位のリストを取得します。
[ Umbrella GS Ranking_read ] 設定した順位のリストを取得します。

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

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


[ RankingSettings ] に

スプレッドシート側で設定した、「Rankingスクリプト」 の 公開URLと、使用する
シート名( RankingName )を入力します。シート名のシートが存在しなければ新たに作られます。
( RankingNumber ) は、何位までを取得するかの設定です。
( Order By ) をDESCにすると、降順 (数字の大きい順)に取得するということになります。

*ASCなら 昇順 (数字の小さい順)になります。タイムアタックのような場合は、こちらを
選択することになるでしょう。

( Size )  Umbrella では一つの[ RankingSettings ]で複数シートを設定、使い分けもできますが
このカスタムアクションでは、一つのシートの使用を想定しています。

シーン内ではMainCamera に PlayMaker のFSM(状態遷移を)をつけています。

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

アクションを一つづつ使用してみます。
[ Umbrella GS Ranking_write
シートにスコアを送信、書き込みます。
送信時に固有の[ userID ] が作成され、PlayerPrefs に保存されます。
以後、送信するたびに、新しいデータが上書きされます。 
この値で、実行してみます。

Sousin_name 、 Sousin_score が送信値です。
NameArray ScoreArray は取得した値を個別に格納する配列 ( Stringタイプ )。
他は、見たままですね。全部を設定する必要はありません。
注( 更新版はFinishEvent が選択できるように、なっています )


値を格納するために用意した変数はこんなところです。


実行時
変数設定で、インスペクタ表示をチェックしていると、このように結果が表示されます。
設定した10位までデータが取得できています。
プレイヤー順位が設定順以外(この場合11位以下)のときは、Zibun_zyuni (int プレイヤー順位)
は -1 になります。

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

シート上では、この様になっています。データはシート上の表示では自動でソートされません。


今回の「マリコ」以外がスコア順に並んでいるのは、シート上でフィルタを使ったソートの
操作をしたからです。また、設定順以外の、データが自動で削除されるということもありません。

ここらへんを、自動でやりたければ、スプレッドシート側で処理のスクリプトを設定して、定時に
自動実行させたりすることは可能のようです。

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


[ Umbrella GS Ranking_read
もう一つのアクションです。
といっても、スコアを送信せずに、リストを読み込むだけです。結果は、先に上げたものと
同じになります。


Userid の削除は 前回の Umbrella_GoogleSheets_Action に含まれている
[Umbrella_User id_sakuzo] で行えます。

通信エラー時はアクションはスルーされ、ステートが止まることはありません。
エラー通知の工夫など、前回記事、「(作成アクション) Umbrella_GoogleSheets_Action 」
を御覧ください。
----------------------------------

ランキングなので、具体的な表示までした方がいいなと作ったサンプルシーンの解説は
次の記事にしたいと思います。
特に、同一 useridであれば送信したスコアがシート上の値を下回っていた場合でも更新して
しまうことへの対処など。

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...

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