【Unity】PostリクエストとCookieへの保存を実装してみる

このサイトを作るときに作ったうさぎのゲーム

✞あなたは○人目の訪問者です✞という昔のサイトによくあったアレを作ってみたかったのでUnity側からサーバー上に置いたphpファイルにpostリクエストを送り、ブラウザにCookieを保存するというのを実装してみました。

1.UnityからPostリクエストを送る

Unity Web Requestを使ってphpファイルにデータを送ってみるやつがこれです。最初はSystem.Netで実装してたんだけどWebGLでは動かなかった

Postのときにデータ受信もするけど、受信だけするタイミングがいくつかあったので受け取りはGetで別で作りました

C#
    // 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);
    }
C#
   // 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
<?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に保存します。

以下のサイトを参考にしました。

実際に書いたものがこれです

JavaScript
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をすることで解決しました。

コンソールではどう見ても一致していたので一生悩んでた。コンソールにも空白を表示してくれ…

Unity

関連記事
guest
0 コメント
古い順
新しい順 投票数順
Inline Feedbacks
全てのコメントを見る