Unity와 Python 간의 데이터 교환
배경
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.csusing 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에 반영하는 것이기 때문에, 추정에 걸리는 시간을 고려하면 문제 없는 정도라고 할 수 있다. 라고 생각한다.
Reference
이 문제에 관하여(Unity와 Python 간의 데이터 교환), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/sakamo1290/items/1daa8c2c2280a04c4b52
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
가능한 한 실시간으로 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.csusing 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에 반영하는 것이기 때문에, 추정에 걸리는 시간을 고려하면 문제 없는 정도라고 할 수 있다. 라고 생각한다.
Reference
이 문제에 관하여(Unity와 Python 간의 데이터 교환), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/sakamo1290/items/1daa8c2c2280a04c4b52
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
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에 반영하는 것이기 때문에, 추정에 걸리는 시간을 고려하면 문제 없는 정도라고 할 수 있다. 라고 생각한다.
Reference
이 문제에 관하여(Unity와 Python 간의 데이터 교환), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/sakamo1290/items/1daa8c2c2280a04c4b52
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Reference
이 문제에 관하여(Unity와 Python 간의 데이터 교환), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/sakamo1290/items/1daa8c2c2280a04c4b52텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)