🧚‍♀️

[入門編] 簡単サーバー不要で外部通信機能を使う方法 #cluster #clusterベータ

2023/12/24に公開

先日更新された cluster Creator Kit に追加された
外部通信機能を使う簡単な方法を書いてみます

使うのも

Googleアカウント
Google Apps Script

Cluster Creator Kit Script
Scriptable Item

onExternalCallEnd

Unity 2021.3.4
ClusterCreatorKitSample

サーバ側を用意する

外部通信機能を使うには サーバを用意する必要があります... が、本格的にサーバを用意しようとすると色々な選択肢があったり難しい部分もあるので、今回は Googleアカウントがあれば利用できる Google Apps Script を利用してみようと思います。

Google Apps Script の説明
"Googleによって開発されたスクリプトプラットフォームである軽量のアプリケーション開発のためのGoogleのワークスペースプラットフォーム" です。 GAS、ガス と呼ばれています。

GAS ファイル作成方法

Apps Script サイトにアクセスして GAS設定をしていきましょう。

  1. 左上の 新しいプロジェクト を押す
  2. 無題のプロジェクト 部分をクリックして プロジェクト名を変更する 今回は SimpleAPI とつけてみましょう

GAS 内容

外部通信機能は HTTP 通信の POSTリクエスト に対応する必要があります。
function doPost(e){} を記載すると HTTP POST リクエストを受け取ることができるようになります。

※ HTTP POST リクエストってなに? って気になった方は mozilla.org POST の内容などをざっとみて理解するといいかもしれません。

// verify トークン は環境変数に設定する
const scriptProperties = PropertiesService.getScriptProperties();
const VERIFY_TOKEN = scriptProperties.getProperty('VERIFY_TOKEN');

function doPost(e) {
  // リクエスト内容 を ログ出力
  const dataAsString = e.postData.getDataAsString();
  const params = JSON.parse(dataAsString);
  const request = JSON.parse(params.request);
  Logger.log(`request ${request}`);

  // レスポンス内容を作成する
  const status = {"message": "Hello world!!"};
  const response = JSON.stringify(status);
  const output = ContentService.createTextOutput();
  output.setMimeType(ContentService.MimeType.JSON);  
  output.setContent(JSON.stringify({ verify: VERIFY_TOKEN, response: response }));  
  return output;
}

デプロイ

GAS 右上の デプロイ を押して 作ったGASを公開してURLを取得します。

  1. 新しいデプロイ を選択
  2. 種類の選択 ウェブアプリ を選択する
  3. 説明 公開URL にして アクセスできるユーザーを 全員 に設定します。
  4. ウェブアプリURL が発行されるので コピーして保存する このURLは後で記載するUnity側の作業で利用します。

アクセスできるユーザー 全員 に設定する事で Creator Kit の 外部通信機能で利用できるようになります。

Creator Kit

Unity側で 動作させるスクリプトを書いてみましょう。
ここではシンプルにクリックしたらデバッグログにサーバから受け取った文字列を表示してみます。

  1. Hierarchy に GameOject を追加
  2. 名前を SampleItem に変更
  3. SampleItem 以下に Hierarchy 右クリック 3D Object -> Cube で Cube を作成
  4. Cube の scale を 0.3 にする
  5. SampleItem に Scriptable Item を追加する
  6. 下記のコードを SampleItem.js としてファイルを作成する
  7. Source Code Asset に SampleItem.js を設定する
$.onInteract(() => {
  const status = {"message": "Interact"};
  const request = JSON.stringify(status);
  // サーバーに送信
  $.callExternal(request, "meta");
});

$.onExternalCallEnd((response, meta, errorReason) => {
  // レスポンスをログに表示する
  $.log(`response ${response}`);
  $.log(`meta ${meta}`);
  $.log(`errorReason ${errorReason}`);
  
  const status = JSON.parse(response);
  const message = status.message;
  $.log(`message ${message}`);
});

Creator Kit 外部通信接続URL

  1. メニュー Cluster -> 外部通信(callExternal)接続URL を選択
  2. URLに デプロイ で作成された GAS の公開URLを入力する
  3. verify用トークン が表示されるのでコピーする 次の GAS環境変数 に設定する

GAS 環境変数

GASで トークンを安全に扱うために 環境変数に設定します。
コード内にトークンを記載するとコード共有がしにくかったり、トークンの漏洩などのリスクが上がるので環境変数に設定してみます。

  1. Apps Script サイトにアクセスする
  2. SimpleAPI を選択
  3. 左下の 歯車 を選択して プロジェクトの設定 を開く
  4. スクリプト プロパティ を開いて VERIFY_TOKEN に 値部分に Creator Kit 外部通信接続URL で発行した verify用トークン を設定する

ここで設定した環境変数は GAS のコード内で PropertiesService を利用することで取得することができます。

// verify トークン は環境変数に設定する
const scriptProperties = PropertiesService.getScriptProperties();
const VERIFY_TOKEN = scriptProperties.getProperty('VERIFY_TOKEN');

ベータ機能を有効にしてアップロード

Cluster Creator Kit Script は アップロードしないと動作しないのでアップロードして確認してみましょう。また ベータ機能 を有効にした状態でアップロードする必要があります。

  1. unity のメニュー Clustr -> Setting を選択
  2. ベータ機能 にチェックをつけて 有効にする
  3. Clustr -> ワールドアップロード を選んで 新規作成 すると [bata] XXXX のワールド設定が作られる。
  4. アップロードする

アプリでログを確認

clusterアプリを起動して アップロードしたワールドに行き ログを確認してみましょう。

  1. メニュー -> 歯車マーク
  2. その他 -> ワールド,クリエイター向け機能 欄のコンソールのスイッチをONにする
  3. 設定を閉じると 画面 右に コンソール欄が表示される
  4. キューブをクリックすると GASと通信して レスポンス内容が表示される

まとめ

ここまでの記事内容で GAS へリクエストを送って ワールド内でレスポンスを受け取ることができるようになったはずです。サーバを用意せずに GAS でサーバ側のコードを記載できるのは手軽でいいはず。

次回は 応用編 で スプレッドシート対応 や Google フォームから入力された内容を使うサンプルコードを説明してみようかなと思っています。

Discussion