Udonで外部にデータを保存する
単純にデータを送信することはできる
GET しかできないので、外部に任意のデータを送信するには URL 上のパラメータとして渡すのが良さそう
ただし、動的に URL を構築するには一手間要る
LoadUrl に渡せるのは VRCUrl 型のみ
そして VRCUrl 型の変数は Udon 内から変更できない!
ユーザーが VRC 内で入力した文字列は VRCUrl 型で受けることができる
つまり Udon で動的に生成した文字列をユーザー入力欄のデフォルト値にして、ユーザーにはそれをコピーしてもらい、別のユーザー入力欄にペーストして OK を押してもらう
これにより動的に URL を構築してデータ送信できる、というワケ
これをもとに URL を構築してみる
UTF-8 の文字列をバイト列に変換して、文字列結合で URL を構築してみる
つまりこれを実装するということ
アイザック は %E3%82%A2%E3%82%A4%E3%82%B6%E3%83%83%E3%82%AF となる
code:encodeURI.cs
byte[] encodedBytes = Encoding.UTF8.GetBytes(baseString); // 文字列を byte の配列に変換
string encodedString = "";
for (int i = 0; i < encodedBytes.Length; i++)
{
encodedString += $"%{encodedBytesi:X2}"; // バイト表現をさらに16進数に変換 }
return encodedString;
こうして出来た文字列を URL のパラメータにくっつける
作った URL を InputField.text に渡す
VRCUrlInputField でないのは、VRCUrlInputField.text へのアクセスが許可されていないから
read only にしておくとやさしい
ユーザーはこれをコピーする
ユーザーはコピーした URL を、今度は VRCUrlInputField にペーストする
On End Edit のコールバック関数で受ける
VRCUrlInputField.GetUrl() で VRCUrl 型に格納された URL が得られる
あとはこれを LoadUrl に渡して実行するだけ!
送られてきた情報をサーバー側で受け取る
URL 上のパラメータを解析する
query string parameter として取得できる
ほとんどのライブラリは勝手にこれをデコードしてくれる、楽
ユーザー固有でデータを保存したい
例えば...
ワールド内設定を保存するとか
ゲームの結果を保存するとか
IP アドレスは確かにユーザーのものではあるが...
同じ回線で複数人 VRC してたら同じ IP アドレスになっちゃうよね、寮とか
プライバシー情報だし、あんま IP アドレスは使いたくない、保存したくない
プレイヤー名を使うのが楽そう
ユニークではあるが変更可能なので、完全には信頼できないという問題はある
ほかに考えること
データを改ざんして送信できてしまう
URL がユーザーの目に触れられる以上、改ざんのリスクがある
VRC 上で改ざんして送信する場合
難読化するとか
あと InputField のテキストの読み込みはできるのだから、InputField と VRCUrlInputField で違いが無いか検証しても良いかも
URL をコピーして別の http client、curl とかから改ざんしたものを投げられる場合
難読化して解析されにくくするしかないかな...
何度も送信できてしまう点
たとえばログインボーナスみたいな仕組みを考えると、何度ももらえたら良くないよね
サーバー側で工夫してやるか