PythonからUnityにHTTPリクエストを送信する方法

eye catch プログラミング

はじめに

こんにちは、kitakaです。

私は最近、AITuberというものをUnityで開発しているのですが、

Unityで作ったアプリに対し、PythonプログラムからAPIリクエストによる操作をしたい!

ということがあり、早速実装してみました。

今回は、PythonからUnityにHTTPリクエストを送信し、Unityでリクエストを処理するプログラムをご紹介します。

プログラムの解説

PythonからUnityにHTTPリクエストを送信する

まずは、PythonからUnityへのリクエスト送信プログラムを作成します。

コードはこちらです。

import requests

text = "testText"

try:
    unity_endpoint = "http://localhost:5000/test"  # Unityアプリのエンドポイント

    # リクエストボディにテキストを含むPOSTリクエストを送信
    response = requests.post(unity_endpoint, data=text.encode('utf-8'))

    if response.status_code == 200:
        print("sent to Unity successfully")
    else:
        print("Failed to send text to Unity")
except Exception as e:
    print(e)

Unityアプリのエンドポイントを指定し、
requests.postによってテキストデータを含んだHTTPリクエストを送信します。

成功している場合、responseが返却されています。
responseのステータスコードが200であれば成功となります。

UnityでHTTPリクエストを処理する

次に、Unity側で受信したリクエストを処理するプログラムを作成します。

HTTPリスナーを使い、簡単なAPIサーバーを実装します。

フィールド

private int port = 5000;
private HttpListener listener;
  • port:サーバーがリッスンするポート番号です。Python側と同じく5000を使用します。
  • listener:HTTPリスナーのインスタンスを保持します。

Start メソッド

void Start() {
    // HTTPリスナーを作成して開始
    listener = new HttpListener();
    listener.Prefixes.Add("http://localhost:" + port + "/");
    listener.Start();

    // 非同期でリクエストを処理
    Task.Run(() => HandleIncomingRequests());
}
  • “http://localhost:5000/”でリクエストを受けつけるように設定します。
  • Task.Run(() => HandleIncomingRequests()) で、非同期にリクエストを処理するメソッドを呼び出します。

HandleIncomingRequests メソッド

async Task HandleIncomingRequests() {
    while (true) {
        // リクエストを待機
        HttpListenerContext context = await listener.GetContextAsync();
        // URLのパス部分を取得
        string urlPath = context.Request.Url.AbsolutePath.ToLower();

        // パスに基づいて処理を分岐
        switch (urlPath) {
            case "/test":
                // テキストを取得、出力
                string text = new StreamReader(context.Request.InputStream).ReadToEnd();
                Debug.Log("テキスト:" + text);
                break;
            // 他機能を作る場合はパスで分ける
            case "/test2":
                // 別の処理を記載
                break;
            default:
                break;
        }
        // Response返却
        ReturnResponse(context);
    }
}
  • listener.GetContextAsync() メソッドを使用して、リクエストが来るのを非同期に待ちます。
  • リクエストが来たら、HttpListenerContext オブジェクトとして受け取ります。
  • リクエストのURLパス部分を取得し、小文字に変換して urlPath に格納します。
  • switch 文を使って、URLパスに基づいて異なる処理を行います。
    /test の場合は、リクエストの中身であるテキスト取得しログ出力しています。
    他機能を増やしたい場合は新たなパスを定義をしてください。

ReturnResponse メソッド

void ReturnResponse(HttpListenerContext context) {
    // レスポンスを返す
    string responseText = "Received text successfully";
    byte[] buffer = System.Text.Encoding.UTF8.GetBytes(responseText);
    context.Response.ContentLength64 = buffer.Length;
    Stream output = context.Response.OutputStream;
    output.Write(buffer, 0, buffer.Length);
    output.Close();
}

正常にリクエストが処理された場合にはこちらのメソッドが実行され、
API呼び出し元にレスポンスが返却されます。

実行結果

実際に実行してみたところ、Unityのデバッグログに、送信したテキストを出力させることができました。

おわりに

今回は、PythonからUnityアプリにHTTPリクエストを送信する方法をご紹介しました。

エンドポイントを複数用意することで、
複数のAPI機能を作成することが可能です。

外部のプログラムとUnityを連携したい際に活用できると思いますので、
ぜひ参考にしてみてください!

私はこれをAITuberの機能の一部に活用しています。
AITuberはYoutubeで公開しているので興味ある方はぜひ覗いてみてください。

椎名メモリア
Share your videos with friends, family, and the world

ありがとうございました。

コメント

タイトルとURLをコピーしました