Unity와 Python 간의 데이터 교환

10674 단어 파이썬Unity

배경



Unity에서 측정 한 데이터를 Python에 보내고 기계 학습에서 추정 한 결과를 가능한 한 실시간으로 Unity 측에 반영하고 싶었지만 서버를 사용하는 것만을 발견하고 실시간으로 상호 작용할 수 없었습니다.

목적



가능한 한 실시간으로 Unity와 Python으로 데이터를 교환하십시오.

Unity 및 Python 코드 : htps : // 기주 b. 코 m / 사카모 1290 / 타타에 x 찬게

Unity:2019.4.28f1
Python:3.7.6

정책



csv (Unity2Python.csv 및 Python2Unity.csv)를 통해 데이터를 교환합니다.

구현



Unity 측에서 FixedUpdate가 호출될 때마다 증가되는 변수(count)를 csv를 통해 교환한다.

파이썬 측



먼저 Python 측에서 데이터를 읽고 쓰는 스크립트를 만든다.

DataExchange.py
#実際に使うときはやり取りするデータは1つではないため、pandasのDataFrameでcsvに読み書きする
import pandas as pd

def main():
    #Unityから送られてきたデータを格納するDataFrame
    log = pd.DataFrame(columns = [0], index = [0], data = [0])
    #データが更新されているかを確認するための変数
    past = -1

    while True:
        past, log = ReadData(past, log)
        WriteData(past)

def ReadData(past, log):#Unityからデータを受け取る
    #データをUnityが書き込んでいるときはアクセスできずエラーになるためtryで回避
    try:
        a = pd.read_csv('Unity2Python.csv', encoding="ms932" ,sep=",")
    except:
        return past, log
    #データが更新されていない場合読み取りを終了する
    if past == a.columns[0]: return past, log

    log = log.append([int(a.columns[0])])
    print(a.columns[0])
    past = a.columns[0]
    return past, log

def WriteData(past):#Unityにデータを送る
    #Unityが読み込んでいるときはアクセスできずエラーになるためtryで回避
    try:
        pd.DataFrame([past]).to_csv(path_or_buf = 'Python2Unity.csv', header=False, index=False)
    except:
        return             

if __name__ == "__main__":
    main()

Unity 측



Unity 측에서도 데이터를 교환하는 스크립트를 작성한다 (git의 DataExchange.unitypackage 내에 완성된 것이 담겨 있다).
새 프로젝트를 만들고 히에랄 키를 마우스 오른쪽 버튼으로 클릭하고 'Create Empty'를 선택합니다.
이름을 'DataExchanger'로 설정하고 관리자에서 'Add Component'를 클릭하여 DataExchanger 스크립트를 만듭니다.

DataExchanger.cs
using System.Collections;
using System.Collections.Generic;
using System.IO;
using UnityEngine;

public class DataExchanger : MonoBehaviour
{
    int count = 0;
    string sendDataPath;
    string recieveDataPath;

    void Start()
    {
        sendDataPath = Application.dataPath + "/LogData/Unity2Python.csv";
        recieveDataPath = Application.dataPath + "/LogData/Python2Unity.csv";
    }

    void FixedUpdate()
    {
        WriteData(count.ToString(), sendDataPath);
        ReadData(recieveDataPath);
        count++;
    }

    void WriteData(string data, string _filePath)
    {
        string _path = _filePath;
        StreamWriter sw;
        FileInfo fi;
        fi = new FileInfo(_path);
        sw = fi.CreateText();
        sw.WriteLine(data);
        sw.Flush();
        sw.Close();
    }

    void ReadData(string _filePath)
    {
        Debug.Log(File.ReadAllText(_filePath));
    }
}

DataExchange.py 배포



Unity 폴더 내에 Assets/LogData가되도록 LogData 폴더를 만듭니다.
LogData 폴더 안에 DataExchange.py를 넣는다 (위치는 여기가 아니어도 문제 없지만 간단을 위해. 바꾸면 스크립트의 경로를 수정한다.).

동작 확인



대개 잘 움직이고 있지만, Unity 측에서 숫자가 날리는 경우가 있다.
목적은 기계 학습의 결과를 Unity에 반영하는 것이기 때문에, 추정에 걸리는 시간을 고려하면 문제 없는 정도라고 할 수 있다. 라고 생각한다.

좋은 웹페이지 즐겨찾기