Skip to main content

ログイン

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データが要らないので、ブラウザーで確認できる:

image.png

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でログインコントローラーを追加し、ボタンを設定する:

image.png

実行すると:

image.png

サーバーの返事を確認できた!

ポップアップを表示

次、結果により、ポップアップを表示しましょう。そのために、JSON をUnityで使えるデータに変換しないければならない。そのため、Unity は便利な機能がある

JsonUtility.ToJson

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

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

  • 公開されている(public)変数か配列
  • floatintboolstring 型の変数か配列

のみ変換できます。例えば:

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);
}

以下のを表示される:

image.png

もちろん、逆のもできる:

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}");
}

image.png

 

まず、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);
    }
}

if文で確認

データベースを作成

API処理を更新