このサイトを作るときに作ったうさぎのゲーム
✞あなたは○人目の訪問者です✞という昔のサイトによくあったアレを作ってみたかったのでUnity側からサーバー上に置いたphpファイルにpostリクエストを送り、ブラウザにCookieを保存するというのを実装してみました。
1.UnityからPostリクエストを送る
Unity Web Requestを使ってphpファイルにデータを送ってみるやつがこれです。最初はSystem.Netで実装してたんだけどWebGLでは動かなかった
Postのときにデータ受信もするけど、受信だけするタイミングがいくつかあったので受け取りはGetで別で作りました
// Postするやつ
string postStr = "key名1=" + "value名1" + "&key名2=" + "value名2";
byte[] postBytes = System.Text.Encoding.UTF8.GetBytes(postStr);
string url = "phpファイルのURL";
var req = new UnityWebRequest(url, "POST");
req.uploadHandler = (UploadHandler)new UploadHandlerRaw(postBytes);
req.downloadHandler = (DownloadHandler)new DownloadHandlerBuffer();
req.SetRequestHeader("Content-Type", "application/x-www-form-urlencoded");
await req.SendWebRequest();
if (req.isNetworkError || req.isHttpError)
{
Debug.Log("Network error:" + req.error);
}
else
{
Debug.Log("Succeeded:" + req.downloadHandler.text);
}
// Getするやつ
public async UniTask<Data> FetchData(){
string url = "phpファイルのURL";
UnityWebRequest request = UnityWebRequest.Get(url);
await request.SendWebRequest();
string s = null;
if (request.isNetworkError || request.isHttpError)
{
Debug.Log(request.error);
}
else
{
Debug.Log(request.downloadHandler.text);
s = request.downloadHandler.text;
}
nowData = strToData(s);
return nowData;
}
2.送られてきたものをphpで処理する
Unity Web Requestで送られてきたものをサーバーに置いたphpファイルで処理します。
phpの方はこんな感じです。
<?php
if (isset($_POST['key名1']) && isset($_POST['key名2'])) {
if ($_POST['key名1'] == 'なにか') {
//実行する処理
}
if ($_POST['key名2'] == 'なにか') {
//実行する処理
}
}
print(file_get_contents("データのテキストファイル"));
使ってるkey名とvalue名を晒すことができない(不正にどうこうされても困らないデータだけども…)
めっちゃ省いていますが送られてきたデータからプレイヤー数をカウントするとかランキングを計算するとかしてデータに書き込み、書き込んだあとのデータを表示しています。
3.Cookieに保存する
初回起動時に何人目の訪問者だったかをCookieに保存します。
以下のサイトを参考にしました。
実際に書いたものがこれです
mergeInto(LibraryManager.library, {
SetVisited: function(n) {
document.cookie = 'visited=' + n;
},
GetVisited: function() {
var cookiesArray = document.cookie.split(';');
for (var i = 0; i < cookiesArray.length; i++)
{
var cArray = cookiesArray[i].split('=');
if (cArray[0].trim() === 'visited')
{
return cArray[1];
}
}
return 0;
}
});
まあほぼ一緒なのですが、「Cookieは保存されているしコンソールに表示されているものも一致しているのに0が返る」現象に陥っていました。
どうやら取得するcookieに空白が含まれていたようで、trimをすることで解決しました。
コンソールではどう見ても一致していたので一生悩んでた。コンソールにも空白を表示してくれ…