2020年10月18日日曜日

[Closest] 最も近いオブジェクトを取得する

「 最も近い」っていうと Nearest なのかなぁ。
と、アクションブラウザ、エコシステムで検索しても、それらしいアクションが出てこない。

PlayMaker Extension Action Scripts というPlayMakerの追加アクションを
セットにした少し古いアセットを持っていて、その中に
[ Find Nearest GameObject In Layer ]

というのアクションがあり、これを使うと、指定したオブジェクトから一番近い場所
にあるオブジェクトと、そこまでの距離が取得できました。
指定したレイヤーにあるオブジェクトが感知対象です。


ところが、どうも現在のUnity 2019 では機能しない。

なので、このような基本的なものは(特に今の)標準アクション等にはあるだろうと
検索してみてのことでした。
ですが、ここで使うべきは、Closest だったんですね。Closest で探すと見つかるのが

 [ Find Closest ]

という標準アクション、指定したオブジェクトから一番近い場所
にあるオブジェクトと、そこまでの距離を取得できます。

指定したタグを持つオブジェクトが感知対象です。

更にエコシステムで検索すると、
[ Find Closest2 ]という、レイヤー指定ができるもの。
[ Find Farthest ] という、最も遠くのオブジェクトを取得するもの、も見つかりました。


CloseNear どちらも距離について話すときには同じ意味だと言うことですが、
画面上の座標の距離のような場合、標準的な英語感覚では、Closestを使用する
ほうが自然ということなのか。
アクションに限らず、英語で検索するときは、注意しないといけないんですね。


PlayMaker Extension Action Scripts の他の機能で、リスト内から最も近い
オブジェクトを選ぶ[  Find Nearest GameObject From List ] は今のUnityでも使えました。

PlayMaker Extension Action Scripts のアクション

2020年8月5日水曜日

「グローバル変数ウィンドウ」とPMエディタへのキー入力

unity 2019 3.3f1 と PlayMaker 1.9.0p20 [ p21も]
で PlayMaker の「グローバル変数ウィンドウ」を開いていると、PlayMaker
通常エディタ内のキー入力がスムーズに出来ないこと。

何か他の要因があるのか、今のところわからない。

似たような症状のある場合、とりあえず「グローバル変数ウィンドウ」を
閉じてみると書き込めるようになるかも。

2020年7月20日月曜日

以前のバージョンのUnity & PlayMaker で作成したプロジェクトを読み込む

大変だったいうお話。
こういうケースは、ままありますね。

「GooglePlayのアプリを64bitに対応させなければ、8月1日以降非公開になる」

なんていうのは、いい例なのかな。Unity 5 で作ったプロジェクトを64bit対応させる
ためには最近のUnityで開いて、ビルドし直さなければならない…
とりあえずやってみよう。ということで、直接 Unity 2019 で開いてみるも、動かない。
コンパイルエラー。バグメッセージは多すぎて読む気にもならない。

Unity だけでもバージョン間の差異があり、更にPlayMakerなどのアセットは、その
バージョンのUnity 用に調整された当時のバージョンだったりする。
新たに現バージョンのPlayMakerを上書きしてみても、動作せず。
複雑さが、ましましです。

以下、他のブログに書いたメモと言うか、愚痴の補足転載でアレなんですが。
 -------------------------------------

GooglePlayのアプリ。64bitに対応させなきゃ8月1日以降非公開にされてしまう件。

で、一つだけは対応させて残そうとしてるのだけれど、大変。
Unity5.7でのプロジェクトを、Unity2019で開いてビルドしなければならない。
(実際は2017.4以降で出来るよう)

比較的単純な仕組みなので、バージョンの影響は受けないだろうと思いきや、
ビジュアルスクリプトPlayMakerのバージョンが合わない。
Unity5時代に対応していたバージョンのPlayMakerが最近のunityでは上手く動かない。

仕方ないので、現バージョンのPlayMakerや関連アセットがインストールされた
「Unity2019プロジェクト」を新たに作り、シーンファイル、絵や音、プレハブなどが入った
関連フォルダを持ち込む。

とりあえず動きそう。
しかし、PlayMakerのグローバル変数は手書きで移植
(ファイル移設出来るはずなのだが、何故か無理)

オブジェクトに設定するTagも不完全でやはり手動移植。

おまけに、iTweenを使っていたため実行エラーが出て止まる…
これは現在のPlayMakerがiTweenをサポートせず、該当アクションとiTweenアセット
自体が存在しないため。
レガシー扱いのITweenアクションとiTweenアセットをインポートしてもどうも上手く動かない。
やはりiTweenは過去のものか。

DOTweenの類似アクションに差し替えて、さて上手く動くか。
ほんとこれ一つだけにしておこう…

 -------------------------------------
実際これで動き、ビルドして、GooglePlayに更新アップロードできたのですが、
何度もやりたいことではないですね()

FSM(状態遷移)は並べられたアクションを名前だけで認識、実行するので
アクションの中身(C#スクリプト)が現在のUnity環境に応じたものになっていれば
そのまま動くだろう。と思い、まあ、そうなのですが、アクション自体が消滅していたり
アクションの挙動が微妙に変わっていたりなどは、どうしようもないです。

ふわっとした感想を言えば、間に入るものが多いほど、それぞれの変化の影響で
複雑さがまし、全体像は見えなくなり、いざ、というとき大変だ…ということですね。

ビジュアルスクリプトはじめ、システムに深く関わるアセットを使用する際のある意味
デメリットかなぁ。このブログであまり書きたくないけれど()

(追記)
愚痴っぽく書いてしまったものの実際は、PlayMakerのアクションを通してUnityに
アクセスしている構造のプロジェクトだから、いくつか問題はあっても 離れたバージョン
のUnity へ(わかりやすい手間だけで)移設できてるんですよね。
システムの差異を吸収してくれているPlayMakerが凄いということです。

Unityのバージョンアップに逐一対応してくれるところが、開発元の信頼されている
理由だと思います。

2020年7月19日日曜日

IL2CPP ビルドと PlayMaker

まず、当ブログ内記事(作成アクション) ローカルストレージ操作  で配布している
アクションの説明に、追記をしました。

*追記 2020 07/17
Android の64bit用ビルドを始め、WebGLプラットフォーム以外のIL2CPP でのビルドの場合
このアクション(スクリプト)はプロジェクトから外してください。
JavaScriptファイルへのファンクション呼び出しがエラーになるようです。


DLした方は、「そんなもんなんだな」ぐらいに思っておいてください。
WebGL用のアクションですが、プラットフォームをスイッチして、このファイル類をそのままに
していると、ビルドエラーに。(JavaScriptファイル自体は大丈夫)

調べてみると、IL2CPPビルドでエラーになる原因は、プロジェクトフォルダまでのパスに
「日本語が含まれていること」と、「参照エラー」ということ。
「JavaScriptファイルへのファンクション呼び出し」が参照エラーになるのでしょう。
実際、PLayMaker関係なくスクリプトの問題ですね。


で、ちょっと気になるのは、プロジェクト内の日本語はどうなのかということ。
結論から言うと、Assets内のフォルダ名、フォルダ内のファイルやプレハブ名、シーン上の
オブジェクト名、などに日本語が含まれていても問題ありませんでした。

また、PlayMaker のFSM(状態遷移)名やステート名、変数名、イベント名、コメントなど
このブログでは、頑なに?日本語を使用していますが、これも問題ありません。

引き続きこのブログでは、PlayMaker内を日本語表記で使用していきたいと思います。


2020年7月17日金曜日

プレハブ内のFSM編集

これまではフォルダにあるプレハブを選択するだけで、プレハブに付けられた
FSM (状態遷移) をPlayMakerエディターで確認、編集できました。

しかし、Unity2019 になってからなのか、ダブルクリックして Hierarchy 内で開いて
からでないと、できなくなりました。
シーン画面がプレハブの内容になってしまい、また、戻るためにクリック、変更の確認
をしなければならず、正直言って面倒になったなぁ…と思ったのですが、良い部分も
ありました。

以前のフォルダ内では、プレハブに子オブジェ、孫オブジェ…がついていた場合も
子オブジェまでしか確認できませんでした。
FSMの編集も当然そこまでで、孫オブジェ以下のFSMはプレハブになってしまうと
プレハブのままでは、追加編集ができなかったのです。
(新たなプレハブとして作り直すしかなく、プロジェクト内で、それまでのものを
インスタンスする部分全てに設定し直し)

ですが、今は Hierarchy 内でプレハブ全体を確認できるので、孫オブジェ以下の
FSM も編集できます。新たに子オブジェクト等を追加することもできます。
複雑な挙動をさせるオブジェクトの場合は、結構助かる面があると思います。


2020年7月12日日曜日

PlayMakerと広告、課金

スマートフォン向けにビルドする場合に利用できる、
「PlayMakerアクション付き、広告、課金処理アセット」
についてです。

定番といえば、Stan's Assets さんのラインナップだと思います。
googole の AdMobや アプリ内課金などに対応したアセットを多く作られていました。

いました…というのは、以前はAdMob広告表示用、アプリ内課金用、SNS連携用などと
小分けで販売されていて、PlayMaker用のアクションも内包されていたのですが、今は
それらがなくなり、

Android用諸々こみの Android Native Pro  IOS用の  IOS Native Pro
両方セットの       Ultimate Mobile Pro     に整理されたようです。

上記の内でPlayMaker用アクションがついているのは、今のところ Ultimate Mobile Pro
だけのようです。どのようなアクションかわかりませんが、以前の 「Google Mobile Ads SDK」
などと同じなら、このような感じでFSM内で簡単に使えるかと。サンプルシーンもありました。

空オブジェなどにノードをまとめておき、グローバルイベントで呼び出すのが
メインか。

今パッと見て、PlayMaker用アクション付きの、AdMobアセットは
Mobile Ads (GDPR Compliant) 20$でしょうか。動画で設置方法も解説されてます。
「Google Mobile Ads SDK」のような、SDKの自動DLなどは出来ないようです。

(追記)
上記 Mobile Ads (GDPR Compliant) ビデオチュートリアル通りで
テスト広告表示できました。Unity 2019.3.3f1 PlayMaker 1.9.0.p20
ボタンアクション等、今のアクションに変更しました。質問があればコメント等で

他 PlayMaker  +
Ads    IAP   Money   または、対象のサービス名
などでアセットストア内を検索すれば、

Unity Ads や日本ではマイナーなサービスにも対応した
PlayMaker用アクション付きアセットが見つかります。

2020年6月25日木曜日

Chronos サンプルシーン

時間制御ができるアセット「Chronos
先日、アセットストアで無償配布となりました。

時間を止めたり、戻したり。使い方次第で面白いものもできそうです。
このアセット、はじめからPlayMaker用のアクションが付いています。

PlayMakerがインストールされている状態で、Chronosをインポートすれば、
アクションブラウザ内にカテゴリが作られ、アクションが並びます。

「Chronos」の他に Physics(Chronos)  Physics 2d(Chronos)
というカテゴリも出来て、物理操作のアクションが並んでいます。

また通常のサンプルシーンの他に、PlayMaker用のサンプルシーン
があり、アクションがどのように使われているか見ることが出来ます。

と、そのアクションが(該当FSMが)ちょっとわかりにくかったのですな。
ここにありました。

二階層下に隠れています。

シンプルに1アクションだけでしょうか。

せっかくなので、いくつかのアクションを試してみるかな。
いずれ記事にするかもしれません。

2020年6月20日土曜日

ニンニンラバー 100% made with PlayMaker



[動画を再生するには、videoタグをサポートしたブラウザが必要です。]
-----------------------------
結果的に100%PlayMakerとして完成できました。
こんなものも作れるという参考に。(動画はビルド前、エディタ上のもの)

[WEBブラウザ版] 推奨環境はWindows[OS] + Firefox[ブラウザ] 。新しいタブで開きます。
[Windows版] PC版。ベクター様へ登録しています。DLページへのリンクになります。

「PlayMakerだけで制作」というのは、このゲーム用にスクリプトを書いていないという
ことです。アセットはDoTween 等、いくつか使用していますが、アセット制作元が用意
したPlayMaker用のアクションを使って、状態遷移の中から利用しています。

ご存知の通り、PlayMakerは大概のC#スクリプトを飲み込んで、アクションとして使用
できるので、あらゆるプロジェクトを無理やり100%PlayMakerとしてしまうことも、
出来なくはないのでしょうが、そのような事をする気もないです。スクリプトと併用して
いいと思います。

ただ、もう現状では用意されたPlayMakerアクションだけでも、大概のことは出来るよう
になっているとも思います。

[ニンニンラバー 説明ページ nomegames]

2020年6月12日金曜日

Nintendo Switch 対応

Playmaker working on Nintendo Switch (Full Setup)

2020年6月5日金曜日

テンプレート

テンプレート機能について記します。
組んだノードを保存しておき、必要なときに取り出して貼り付けることができます。

この機能、以前は少し使いにくく、自分は作ったノードを一つのオブジェにまとめておき
手動でコピペしたりしていましたが、今はシンプルにサクッと使えるようです。

ノード(機能)のコレクションがたまると、コピペだけで簡単なゲームが作れたり、
土台や枠組みを手早く整えられたりと便利です。
ビジュアルスクリプトは、制作環境を自己流に育てていくのも面白みの一つだと思います。

 ------------------------
 2020 0707 追記
どうも保存したテンプレートを他プロジェクトへ持ち込んでも、ノードがうまく反映
されません(PlayMaker 1.9.0) 自環境だけの問題なのかもわかりません。
やっぱりなんか安定しないんだろかこの機能…。

上手くいかない方は、先に書いたように、任意のオブジェクトに、使いまわしたい
ノード群をコピーし、プレハブとして他のプロジェクトに移設。
そこから取り出して使う、等の方法もあります。

 ------------------------
一つ前の投稿の、「BGMフェードイン」のノードをテンプレートに保存してみます。
「BGM開始」のイベントを受け取って、サウンドをフェードインで演奏するものです。

保存したいノードの範囲を選択して、右クリック。 「テンプレートを保存」を選択。


適当な名前で保存します。保存場所は Assets_PlayMaker_Templates になります。

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

保存したテンプレートを、他のオブジェのFSM(状態遷移)に貼り付けてみます。
右クリックから、「テンプレートをペースト」で選択。


フェードイン演奏機能がコピペされました。
今回のような場合、受信イベント「BGM開始」もFSMに自動で加えられます。


 2とついているのは、同様のノードが枠外にあったためで、重複防止のため
自動で付加されました。

ノードのコピーは、テンプレート機能を介さなくても単純に、
ノード選択 → コピー → ペーストでコピー場所を含めどのFSMにでも
自由に複製できます。

2020年5月15日金曜日

サウンドのフェードイン・アウト

結構前の投稿で、いずれBGMのフェードについて記そう、と書いたままで
放置してた気がします。

今、自作ゲームでBGM調整してて思い出しました…
サウンドをアクションでフェードイン・アウトさせる方法について説明します。

まずエコシステム
[ Audio Fade In ] [ Audio Fade Out ]
の2つのアクションを入手します。
 アクションブラウザカテゴリ[ AUDIO ]にアクションが格納されます。

このアクション、今も修正されていなければ、フェードイン、フェードアウトが逆なのです。
そこも踏まえて実際にノードを組んでみます。

サウンド素材を用意した状態で、適当に空オブジェクト[ emp test BGM ] を作り
状態遷移を設定します。

こんなノードを作ってみました。
グローバルイベント「BGM開始」 を受信するとBGMを演奏。
「BGM終了」 を受信で演奏を止めます。


インスペクタには[ Audio Souce ]コンポーネントを付けます。
( AUDIO関連のアクションを使うと1クリックで自動付与)
線の部分に、用意したサウンド素材をドロップ。

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

フェードイン_演奏の方を見てみます。
はじめのステートにこのようにアクションを並べます。演奏ボリュームを"0"に。
Next Frame Event は演奏終了を待たずに、次のステートに移動するためです。


次のステートがフェードイン処理。アクションは [ Audio Fade Out ]逆なんですね。
1秒でボリュームを1(最大)にするということです。

----------------------------------------
フェードアウト_演奏停止の方です。アクションは [ Audio Fade In ]
BGMが演奏されている状態から、1秒で音量を0にします。

次のステートで[ Audio Stop ] 演奏停止です。


もちろん、これらのアクションを使わない方法もあります。VolumeをFloat変数にして
値をアニメーションさせるなど。このアクションが一番簡単だとは思いますが。

素材を使い分ける場合などは、[ Set Audio Clip ] や [Set Audio Loop] などで、
使用する素材やループ再生の有無を調整することになります。

参考、ブログ内記事 [PM] BGMをループ再生し続ける

2020年4月27日月曜日

カスタムアクション倉庫

通常エコシステム [ Ecosystem ] から入手するカスタムアクションですが、
GitHub上にまとまって保管されてもいます。(Ecosystemとは)

https://github.com/PlayMakerEcosystem 

エコシステム_ブラウザから検索しても、目当てのアクションがない、
あるいは、エコシステムが機能していない場合、こちらをあたって
みてもいいかもしれません。
Assets/PlayMaker Custom Actions の中にアクションファイルがあります。
 

最新のものは
PlayMakerCustomActions_U5_Assets_PlayMaker Custom Actions
にあるようですが、エコシステムからは見つかっても、ここに並んでないものも
あるよう。丹念に見れば他のカテゴリにあるのかな。

__________________________________________

持っていると重宝するカスタムアクションを、ブログ内のこちらのページ

おすすめカスタムアクション

に随時列挙してみようと思います。

2020年4月26日日曜日

C#スクリプトとの連携

以前にも少し書いたのですが、PlayMakerと、シーン上のオブジェクトに付けた
C#スクリプトとの連携について補足しておきます。

1: PlayMakerからのアプローチ。
PlayMakerのステート内から、C#スクリプト内の変数の値を取得、設定する。
メソッドを実行する。

2: C#スクリプトからのアプローチ。
C#スクリプトから、PlayMaker、FSM内の変数の値を取得する、設定する。
FSMにイベントを発信する。

@ ------------------------------ @

1のPlayMakerからのアプローチについては、
ブログ内ページ  コンポーネントの値を操作する[Set Property] に説明した通りです。
インスペクタに表示されたスクリプトを、PlayMakerエディタのアクション欄にドロップする
だけで、CallMethod[メソッド実行] SetProperty[変数設定] GetProperty[変数取得] が
行えます。

PlayMakerからスクリプトを操作するのは、わかり易く簡単です。

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

2の C#スクリプトからのアプローチ

まず、PlayMaker、FSMへのイベント発信について。
シーン内の全てのPlayMaker_FSMに対して全体イベントを発信するには、
C#スクリプト内に

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

のように記すことで、イベントを送ることができます。(個別は少し面倒、参照
そして、FSM内で、このようにグローバルイベントとして受け取ることができます。


そして、スクリプトからFSM内の変数操作

□ C#スクリプトからPlayMakerのグローバル変数を操作は

冒頭で

using HutongGames.PlayMaker;

を記した上で

// PlayMaker のグローバル変数 showtextへ スクリプト内の変数
// Hyouji の内容を代入する。
FsmVariables.GlobalVariables.GetFsmString("showtext").Value = Hyouji;

のように行います。


■ C#スクリプトから個別のFSMの変数を操作する場合は

冒頭で

using HutongGames.PlayMaker;

を記した上で

// PlayMakerFSM 型の変数、Kube_fsm を作成
PlayMakerFSM Kube_fsm;

// Kube_fsm に 「Cube」という名前のオブジェクトのFSMコンポーネントを代入する
Kube_fsm = GameObject.Find ("Cube").GetComponent<PlayMakerFSM> ();

// Kube_fsmに格納したFSM の 整数型変数Cube_Xの値を1にする
Kube_fsm.FsmVariables.GetFsmInt ("Cube_X").Value = 1;

のように行います。

(参考 複数のFSMが付いたオブジェクトの場合
スクリプトからPlaymakerのローカル/グローバル変数にアクセスする方法)

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

このように、C#スクリプトからPlayMakerの個別のFSMにアプローチするのは
少し面倒です。

スクリプト内から変数を渡す、受け取る、必要がある場合は、グローバルイベント
でPlayMakerのFSMに合図を送り、ステートからスクリプト内の変数の内容を
受け取る、FSM内の変数を渡す、等に置き換えたほうが楽だと思います。

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

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