# 事前の準備

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

## Awaitable とは

[非同期処理について](https://class.illogic.games/books/642e9/page/unity "Unityで待機ができる処理：非同期処理")


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

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

#### GET リクエスト

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

使用例：

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

ここで：

<table border="1" id="bkmrk-https%3A%2F%2Fapi.my-game." style="border-collapse: collapse; width: 100%; height: 89.4px;"><colgroup><col style="width: 30.1786%;"></col><col style="width: 69.9406%;"></col></colgroup><tbody><tr style="height: 29.8px;"><td style="height: 29.8px;">https://api.my-game.co.jp/api</td><td style="height: 29.8px;">APIの「根」（Root URL）</td></tr><tr style="height: 29.8px;"><td style="height: 29.8px;">check\_login.php</td><td style="height: 29.8px;">サーバーの中で使いたい機能（ログインをチェック）</td></tr><tr style="height: 29.8px;"><td style="height: 29.8px;">?user\_id=45b99aef</td><td style="height: 29.8px;">URLパラメータ（ユーザーのID）</td></tr></tbody></table>

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

#### POST リクエスト

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

使用例：

```c#
// 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 を使用し、返事を待つことができる：

```c#
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();

    // 返事を処理
}
```

### 返事を処理

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

```c#
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;

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

## UnityでJSONを使用

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

`com.unity.nuget.newtonsoft-json`

![image.png](https://class.illogic.games/uploads/images/gallery/2026-08/scaled-1680-/Nrtimage.png)

![image.png](https://class.illogic.games/uploads/images/gallery/2026-08/scaled-1680-/5BZimage.png)

### JSONのデータ管理

パッケージをインストールすると、2つの新しいクラスが利用可能にななる：`JObject` と `JArray`

`JObject` はディクショナリー（連想配列）として機能する。次のように、キー名を使用してJSONデータの各値にアクセスでる。

```c#
private void Start()
{
    JObject json = new JObject();
    json["player_name"] = "タロウ"; // プレーヤー名
    json["exp_points"]  = 1024;    // 経験値
    
    Debug.Log(json.ToString());   // 文字列にする
}
```

その結果、コンソールに次のメッセージが表示されます：

![image.png](https://class.illogic.games/uploads/images/gallery/2026-08/scaled-1680-/s2kimage.png)

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

```c#
private void Start()
{
    JObject json = new JObject();
    json["player_name"] = "タロウ"; // プレーヤー名
    json["exp_points"] = 1024;     // 経験値
    
    JArray items = new JArray();  // 配列
    items.Add(100);
    items.Add(200);
    items.Add(300);
    
    json["items"] = items;        // JSONに追加
    
    Debug.Log(json.ToString());   // 文字列にする
}
```

実行すると、以下のようになる：

![image.png](https://class.illogic.games/uploads/images/gallery/2026-08/scaled-1680-/ItSimage.png)

### 文字列から JObject へ変換

前述のように、`JObject.ToString()` を使用すると、JObject を文字列に変換できる。その逆も可能です。`JObject.Parse() `を使用すると、文字列を `JObject` に変換できる。例えば：

```c#
private void Start()
{
    // JSONの文字列
    string text = "{ \"player_name\" : \"P1\", \"exp_points\" : 555, \"items\" : [40, 30, 20] }";
    
    // JObjectへ変換
    JObject json = JObject.Parse(text);
    
    Debug.Log("プレーヤー名:" + (string)json["player_name"]);
    Debug.Log("経験値:" + (int)json["exp_points"]);

    // JArrayをアクセス
    JArray items = (JArray)json["items"];
    Debug.Log("1個目のアイテム：" + (int)items[0]);
}
```

次のような出力が表示される：

![image.png](https://class.illogic.games/uploads/images/gallery/2026-08/scaled-1680-/VCoimage.png)

## ポップアップ表示の確認

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

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

```c#
// ただのポップアップを表示する（決定ボタンのみ）
PopupController.Show("タイトル", "詳細メッセージ");

// 決定ボタンとキャンセルボタンを表示し、イベントに登録
var popup = PopupController.Show("タイトル", "メッセージ", PopupButtons.Ok | PopupButtons.Cancel);
popup.ButtonClicked += OnPopupButton;
```

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

```c#
// ポップアップのボタンを処理
private void OnPopupButton(PopupButtons button)
{
    switch (button)
    {
        // 決定を押した
        case PopupButtons.Ok:
            break;

        // キャンセルを押した
        case PopupButtons.Cancel:
            break;        
    }
}
```

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

![image.png](https://class.illogic.games/uploads/images/gallery/2026-08/scaled-1680-/c7Simage.png)