pythonとunity間でのデータ受け渡し方法
結構需要ありそうなのと、ネットにあまり情報を見つけられなかったので、記事にしときます。
pythonでAI処理(機械学習、深層学習)によって判別したラベル情報をunity側におくって可視化する。
という流れは避けて通れない道というか,
unityで機械学習のデータを使いたいなら必須な気がします。
これには
UDP通信というものを使います。
送信側(python)はデータをずっと流し続ける。
受信側は(unity)はデータが来たら処理をする。
というプロトコルです。
さっそくプログラムを載せます。
送信側は
#python送信側
import socket
import random
HOST = '127.0.0.1'
PORT = 50007
client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
while True:
a = random.randrange(3)
result = str(a)
print(a)
client.sendto(result.encode('utf-8'),(HOST,PORT))
time.sleep(2.0)
この送信側は0,1,2かを2秒おきに一回送るプログラムです。
PORTはマンションのどこの部屋か指定するためのもの。
各アプリケーションを区別するために使用されるのが「UDPポート番号」
HOST 127.0.0.1は自分自身を指す特別なIPアドレスです。
自分自身の上で動作しているサービスへ接続する場合は、このIPアドレスを利用できる。
この上のプログラムでPORTにランダムに数字を送ることができます。
#C#(unity)受信側
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
public class UDP : MonoBehaviour {
static UdpClient udp;
IPEndPoint remoteEP = null;
int i = 0;
// Use this for initialization
void Start () {
int LOCA_LPORT = 50007;
udp = new UdpClient(LOCA_LPORT);
udp.Client.ReceiveTimeout = 2000;
}
// Update is called once per frame
void Update ()
{
IPEndPoint remoteEP = null;
byte[] data = udp.Receive(ref remoteEP);
string text = Encoding.UTF8.GetString(data);
Debug.Log(text);
}
}pythonで送らてくるデータは0,1,2を'utf-8'(byte型)にしたもの(エンコードしたもの)
それをC#側ではとりあえずバイト型のdataという配列でうけとります。
その後string型にして、unityで見ることができます。
あとはこれをカスタマイズして自分の好みに合うように作りましょう。

Pythonではじめる機械学習 ―scikit-learnで学ぶ特徴量エンジニアリングと機械学習の基礎
- 作者: Andreas C. Muller,Sarah Guido,中田秀基
- 出版社/メーカー: オライリージャパン
- 発売日: 2017/05/25
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (1件) を見る