Run Python on Unity, .Net - IronPython
유니티에서 파이썬을 쓸일이 생겼었다. 그래서 찾아보니 IronPython이란 것이 있더라,
https://ironpython.net/
간략히 말해 .Net FrameWork상에서 구동이 가능한 파이썬엔진 정도로 생각하시면되겠다. 당연히 exe 파일도 제공해주어 명령프롬프트로도 돌릴 수 있다.
이대로 써도 좋지만 몇가지 더 도움될만한 것이 있다.
https://github.com/exodrifter/unity-python
누군가 간단히 유니티에 맞춰서 스크립트를 짜둔것이다. 이 사람이 짜둔 스크립트로 엔진을 생성하면 알아서 콜백에 로그를 심어줘서 편하다.
아래는 간단한 예제다
####
private List<string> Libs; //라이브러리의 경로를 보관한다.
private string _code; //실행할 파이썬의 코드를 저장한다.
private void Awake()
{
string url = Application.dataPath + "/python/test.py"; //경로 불러오기
_code = File.ReadAllText(url); //코드 불러오기
Libs = new List<string> //라이브러리 경로 지정
{
Application.dataPath + "/Python/Lib",
};
//주의! 반드시 스레드로 할 것을 추천한다. 단일스레드 유니티 특성상 실행동안 굳는데, 시간이 길어지면 오류로 인식하고 종료된다.
new Thread(new ThreadStart(Run)).Start();
}
private void Run()
{
//Python에서 sys.argv로 실행인자를 받도록 하는 것을 알것이다. 그것을 .Net에서 입력해주는 것이다.
var argv = new List(); //리스트 생성
argv.Add("__main__.py"); //파이썬 명. 왜냐면 sys.argv[0]은 실행명이라서
argv.Add("test"); //문자열 입력
var engine = UnityPython.CreateEngine(); //엔진생성. 원래는 Python.CreateEngine(); 인데, 이게 위에서 언급한 것이다.
var scope = engine.CreateScope(); //스코프 생성
engine.Runtime.GetSysModule().SetVariable("argv", argv); //sys.argv 입력
var paths = engine.GetSearchPaths(); //라이브러리들의 위치를 입력해줘야한다.
foreach (string s in Libs)
paths.Add(s);
engine.SetSearchPaths(paths); //라이브러리 등록
StringBuilder code = new StringBuilder(); //문자열 처리할 것이 많으면 StringBuilder가 좋다.
code.Append( "import UnityEngine\n"); //이렇게 하면 유니티의 메소드를 Python에서 구동할 수 있다.
code.Append( _code); //코드 추가
code = code.Replace("print", "UnityEngine.Debug.Log"); //이렇게 하면 결과를 출력받을 수 있다. cmd에서는 print로 되니 문제도 발생안하고 좋다.
var script= engine.CreateScriptSourceFromString(code.ToString()); // 코드 등록
script.Execute(); //실행
}
#######