Unity/Common

Run Python on Unity, .Net - IronPython

JAVART 2019. 3. 1. 03:03
반응형

유니티에서 파이썬을 쓸일이 생겼었다. 그래서 찾아보니 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(); //실행

}

#######




반응형