Skip to main content

事前の準備

Unity + PHP + MySQLプロジェクトを構築する前に、いくつか学習しておくべき項目がある。

Awaitable とは

非同期処理について

UnityからWebサーバーへの依頼:UnityWebRequest

これまではブラウザでサーバーに接続し、PHPスクリプトを実行してきたが、これからはUnityからリクエストを送信する。そのため、UnityWebRequest クラスを使用して、指定したURLに接続する機能がある。

GET リクエスト

// GETでリクエストを送信
// url:接続したアドレス
// request:待機できるオブジェクト
var request = UnityWebRequest.Get(url); 

使用例:

// ユーザーIDでログインしているかどうかを確認
var request = UnityWebRequest.Get("https://api.my-game.co.jp/api/check_login.php?user_id=45b99aef"); 

ここで:

https://api.my-game.co.jp/api APIの「根」(Root URL)
check_login.php サーバーの中で使いたい機能(ログインをチェック)
?user_id=45b99aef URLパラメータ(ユーザーのID)

もちろん、上記のAPIはあくまでの例であり、ゲームにより変わるので、具体的なAPIはサーバーエンジニアに相談してください。

POST リクエスト

// POSTでリクエストを送信
// url:接続したアドレス
// data:POST データ (WWWForm)
// request:待機できるオブジェクト
var request = UnityWebRequest.Post(url, data); 

使用例:

// POSTでデータを送るので、フォームを用意する
// サーバーが期待しているデータに合わせる
var data = new WWWForm();
data.AddField("user_id", "45b99aef");

// ログインAPIのURLへリクエストを送信
var request = UnityWebRequest.Post("https://api.my-game.co.jp/api/check_login.php", data);

これ、 GET と同じリクエストであるが、POST でデータを送信した例である。

返事を待つ

ネットワークの状況やサーバーの混雑により、返事がすぐ来ない場合もあるので、リクエストが終わるまで待機する必要がある。Awaitable を使用し、返事を待つことができる:

public async Awaitable CheckLogin(string user)
{
    // POSTでデータを送るので、フォームを用意する
    // サーバーが期待しているデータに合わせる
    var data = new WWWForm();
    data.AddField("user_id", "45b99aef");
    
    // ログインAPIのURLへリクエストを送信
    var request = UnityWebRequest.Post("https://api.my-game.co.jp/api/check_login.php", data);
    
    // 返事を待機する
    await request.SendWebRequest();

    // 返事を処理
}

返事を処理

最後、サーバーの返事を確認し、適切に処理する。データが2つの求め方がある:「テキスト(文字列)」、または「バイナリデータ」

public async Awaitable CheckLogin(string user)
{
    // POSTでデータを送るので、フォームを用意する
    // サーバーが期待しているデータに合わせる
    var data = new WWWForm();
    data.AddField("user_id", "45b99aef");
    
    // ログインAPIのURLへリクエストを送信
    var request = UnityWebRequest.Post("https://api.my-game.co.jp/api/check_login.php", data);
    
    // 返事を待機する
    await request.SendWebRequest();

    // 返事を処理。以下のどちらか使う
    // 文字列
    string textResponse = request.downloadHandler.text

    // 生のバイナリデータ(画像など)
    bytes[] byteResponse = request.downloadHandler.data;

    // なにかの処理をする
}

JSONとC#データの変換UnityでJSONを使用

PHPでは、JSONのデータ形式を学んだが、Unityでも利用できる。これから Unity と PHP のやりとりは JSON で行うため、JSONデータを管理しやすくツールを使用しましょう。Unity は JSONに対応していないが、パッケージとして追加できる。Package Manager を開き、「Install Package By Name」 を選択し、次のパッケージをインストールしてください:

JsonUtility.ToJson

// C# のオブジェクトをJSONの文字列にする。 string com.unity.nuget.newtonsoft-json = JsonUtility.ToJson(なにかのオブジェクト);

これで、あるクラス、または構造体から作ったインスタンスをJSON形式の文字列を作成する。ただし:image.png

    image.png

    公開されている(

    JSONのデータ管理

    パッケージをインストールすると、2つの新しいクラスが利用可能にななる:public)変数か配列

    floatintboolstringJObject 型の変数か配列
    JArray

    のみ変換できます。例えば:JObject はディクショナリー(連想配列)として機能する。次のように、キー名を使用してJSONデータの各値にアクセスでる。

    [Serializable]     // JSONの変換のために必要
    public class Data
    {
        // 経験値
        public int XP = 1000;
        
        // 名前
        public string HeroName = "ヒーロー";
        
        // private なので、JSONにできない
        private float HitPower = 12.25f;
    }
    
    private void Start()
    {
        //JObject インスタンスを作成
        Data datajson = new Data(JObject();
        json["player_name"] = "タロウ"; // プレーヤー名
        json["exp_points"]  = 1024;    // 経験値
        
        Debug.Log(json.ToString());   // JSON文字列にする
        string json = JsonUtility.ToJson(data);
        
        // 表示
        Debug.Log(json);文字列にする
    }

    以下のを表示される:その結果、コンソールに次のメッセージが表示されます:

    image.pngimage.png

    もちろん、逆のもできる:JArray は、同じ型の値からなる配列である。リストが必要な場合は、JObject の一部として使用できる。例えば、

    JsonUtility.FromJson

    private void Start()
    {
        JObject json = new JObject();
        json["player_name"] = "タロウ"; // JSONの文字列からあるクラス(または構造体)のインスタンスを作成プレーヤー名
        データ型 オブジェクト名json["exp_points"] = JsonUtility.FromJson<データ型>(string1024;     json)// 経験値
        
        JArray items = new JArray();  // 配列
        items.Add(100);
        items.Add(200);
        items.Add(300);
        
        json["items"] = items;        // JSONに追加
        
        Debug.Log(json.ToString());   // 文字列にする
    }

    これで、実行すると、以下のようになる:

    image.png

    文字列から JObject へ変換

    前述のように、ToJson(JObject.ToString() の逆処理ができる。ここで「データ型」は変換したいクラス名(または構造体名)である。例えば、を使用すると、JObject を文字列に変換できる。その逆も可能です。JObject.Parse() を使用すると、文字列を JObject に変換できる。例えば:

    private void Start()
    {
        // インスタンスを作成
        Data data = new Data();
        
        // 元のデータ
        Debug.Log($"前 >> 名前:{data.HeroName}, 経験値:{data.XP}");
        
        // JSONデータJSONの文字列
        string jsontext = "{\"XP\":5000, \"HeroName\player_name\" : \"アンパンマン\P1\", \"exp_points\" : 555, \"items\" : [40, 30, 20] }";
        
        // JSONからオブジェクトにするJObjectへ変換
        dataJObject json = JsonUtility.FromJson<Data>JObject.Parse(text);
        
        Debug.Log("プレーヤー名:" + (json)string)json["player_name"]);
        Debug.Log("経験値:" + (int)json["exp_points"]);
    
        // 変わった後JArrayをアクセス
        JArray items = (JArray)json["items"];
        Debug.Log($"1個目のアイテム:" >>+ 名前:{data.HeroName}, 経験値:{data.XP}"(int)items[0]);
    }

    image.png次のような出力が表示される:

    image.png

    ポップアップ表示の確認

    本プロジェクトはすでにいくつかの便利な機能を実装されている。好きなメッセージを表示し、ボタンのイベントにも登録できる

    ポップアップ表示、イベント登録

    // ただのポップアップを表示する(決定ボタンのみ)
    PopupController.Show("タイトル", "詳細メッセージ");
    
    // 決定ボタンとキャンセルボタンを表示し、イベントに登録
    var popup = PopupController.Show("タイトル", "メッセージ", PopupButtons.Ok | PopupButtons.Cancel);
    popup.ButtonClicked += OnPopupButton;

    そして、他のメソッドでイベントを処理する:

    // ポップアップのボタンを処理
    private void OnPopupButton(PopupButtons button)
    {
        switch (button)
        {
            // 決定を押した
            case PopupButtons.Ok:
                break;
    
            // キャンセルを押した
            case PopupButtons.Cancel:
                break;        
        }
    }

    Unityで以下のように見えます:

    image.png