ログイン
PHPでAPIを作成(固定結果)
まず、Unityから接続できるようにしたいので、サーバーでログイン API の機能を追加しましょう。データベースがまだ作成していないため、ひとまず固定の結果を返しましょう。
C:\xmpp\htdocs\api フォルダを作成しましょう。この中に本ゲームのオンライン機能を実装していくフォルダにする。その中にlogin.php というからのテキストファイルを作成してください。単純に、成功したかどうかを固定数値として返しましょう:
<?php
// JSONを返すべき
header("Content-Type: application/json; charset=utf-8");
// 成功したかどうかを返す
$json['success'] = true;
// 返す
print(json_encode($json));
?>
まだPOSTデータが要らないので、ブラウザーで確認できる:

Unityを使い、APIとの接続
仮で作ったログインAPIを試すため、UnityでAPI管理クラスを作ってみましょう。まず、単純に:
// サーバーに依頼するメソッドの一覧
public static class APIRequest
{
// サーバーのAPIのURL
private const string ServerAPI = "http://localhost/api";
// ログイン
public static async Awaitable LoginAsync()
{
// ログインAPIのURLへリクエストを送信
const string url = ServerAPI + "/login.php";
var webRequest = UnityWebRequest.Get(url);
// 返事を待機する
await webRequest.SendWebRequest();
// 返事の文字列を取得
var webResponse = webRequest.downloadHandler.text;
// デバッグ用
Debug.Log(webResponse);
}
}
試すには、トップメニュー画面で、「ログイン」ボタンを押したら、上記のメソッドを使用しましょう:
// ログイン処理する
public class LoginController : MonoBehaviour
{
// ログインボタン
[SerializeField] private Button sendButton;
// ログインボタンを押したとき
private async void OnSendClicked()
{
// リクエストを送信し、待機する
var request = APIRequest.LoginAsync();
await request;
}
// 有効になった時
private void OnEnable()
{
sendButton.onClick.AddListener(OnSendClicked);
}
// 無効になった時
private void OnDisable()
{
sendButton.onClick.RemoveAllListeners();
}
}
Unityでログインコントローラーを追加し、ボタンを設定する:

実行すると:

サーバーの返事を確認できた!
ポップアップを表示
次、結果により、ポップアップを表示しましょう。そのために、JSON をUnityで使えるデータに変換しないければならない。そのため、Unity は便利な機能がある
JsonUtility.ToJson
// C# のオブジェクトをJSONの文字列にする。
string json = JsonUtility.ToJson(なにかのオブジェクト);
これで、あるクラス、または構造体から作ったインスタンスをJSON形式の文字列を作成する。ただし:
public)変数か配列
float、int、bool、string 型の変数か配列のみ変換できます。例えば:
public class Data
{
// 経験値
public int XP = 1000;
// 名前
public string HeroName = "ヒーロー";
// private なので、JSONにできない
private float HitPower = 12.25f;
}
private void Start()
{
// インスタンスを作成
Data data = new Data();
// JSON文字列にする
string json = JsonUtility.ToJson(data);
// 表示
Debug.Log(json);
}
以下のを表示される:

もちろん、逆のもできる:
JsonUtility.FromJson
// JSONの文字列からあるクラス(または構造体)のインスタンスを作成
データ型 オブジェクト名 = JsonUtility.FromJson<データ型>(string json);
これで、ToJson() の逆処理ができる。ここで「データ型」は変換したいクラス名(または構造体名)である。例えば、
private void Start()
{
// インスタンスを作成
Data data = new Data();
// 元のデータ
Debug.Log($"前 >> 名前:{data.HeroName}, 経験値:{data.XP}");
// JSONデータ
string json = "{\"XP\":5000, \"HeroName\":\"アンパンマン\" }";
// JSONからオブジェクトにする
data = JsonUtility.FromJson<Data>(json);
// 変わった後
Debug.Log($"後 >> 名前:{data.HeroName}, 経験値:{data.XP}");
}

まず、APIRequest を編集し、成功したかどうかを返しましょう:
// ログインの結果
public struct LoginResponse
{
// 成功したか?
public bool success;
}
// サーバーに依頼するメソッドの一覧
public static class APIRequest
{
// サーバーのAPIのURL
private const string ServerAPI = "http://localhost/api";
// 非同期処理:ログイン
// user:ユーザー名
// password:パスワード
public static async Awaitable<LoginResponse> LoginAsync(string user, string password)
{
// POSTでデータを送るので、フォームを用意する
// サーバーが期待しているデータに合わせる
var postData = new WWWForm();
postData.AddField("user", user);
postData.AddField("pass", password);
// ログインAPIのURLへリクエストを送信
const string url = ServerAPI + "/login.php";
var webRequest = UnityWebRequest.Post(url, postData);
// 返事を待機する
await webRequest.SendWebRequest();
// 返事の文字列を取得
var webResponse = webRequest.downloadHandler.text;
// デバッグ用
// Debug.Log(webResponse);
// JSONから使えるデータにする
return JsonUtility.FromJson<LoginResponse>(webResponse);
}
}