유니티에서python을 사용하는 매력과 사용법을 총결하였다

왜 유니티에서python을 사용하고 싶어요?


이것은 단지 나의 개인적인 의견일 뿐이다.

유니티를 사용했기 때문에.


개인적으로 유니티를 좋아하니까.VR, AI가 주목받는 현재 유니티와python은 수요가 증가할 것이라고 생각한다.
그 두 가지를 조합할 수 있다는 것은 매우 매력적이다.

GUI에서 python 변수의 내용을 변경할 수 있습니다.


유니티의 Serialize Field를 사용하면 유니티의 검사기 창에서 변수의 내용을 설정할 수 있습니다.

python에서, 예를 들어 기계 학습 파라미터를 변경해야 할 때, 굳이 파일을 열지 않아도 검사기 창에서 내용을 삭제하기 편리합니다.

유니티 화면에서python의 연산 결과를 간단명료하게 표시할 수 있다


또한 유니티는 게임과 직관적인 응용 프로그램 제작에도 뛰어나다.
'python으로 하여금 기계 학습 등을 하게 하는 연산, 그 결과에 따라 서로 다른 동작을 일으키는 유니티 게임'등을 만들 수도 있다.

ironpython이python2인가python3인가


공식 사이트에서 날아보기github 페이지

python2,python3 둘 다 있고 ironpython3는'Do NOT USE'가 있습니다.ironpython3.

아직 충분히 사용하지 않은 상태인 것 같습니다.
앞으로를 기대하다.

설치 방법


kitao's blog선생님 참고

무사히 마쳤습니다.cs 스크립트를 GameObject에 추가하는 것을 잊지 마십시오.

프로그램 예


객체 생성


인터넷 블로그선생님 참고
python 코드에서 다음과 같이 변경합니다
test.txt

#!/usr/bin/env python

import clr
clr.AddReferenceByPartialName('UnityEngine')
import UnityEngine
from UnityEngine import *

def call_test():
    go = GameObject()
    go.name = 'pokemon'
    rigidbody = go.AddComponent( Rigidbody )
    rigidbody.isKinematic = True

call_test()


포켓몬 개체 생성 확인 및 Rigidbody 추가

.net 사용 라이브러리


각양각색의 비망록 일기선생님 참고
test.txt

#!/usr/bin/env python

import clr
clr.AddReferenceByPartialName('UnityEngine')
import UnityEngine
from UnityEngine import *

import System as _s

def print_message():
    #OSVersion is Microsoft Windows NT **.*.* ****.*を出力
    Debug.Log("OSVersion is " + str(_s.Environment.OSVersion))

print_message()

겸사겸사 말씀드리지만, Debug.로그의 함수에서
Debug.Log("OSVersion is " + _s.Environment.OSVersion)
다음 오류가 발생했습니다.
TypeErrorException: unsupported operand type(s) for +: 'str' and 'OperatingSystem'
python의 기호에 따라 UnityEngine을 호출해야 합니다.

값 전달(외부 객체 협업)


SetVariable을 사용하면 python 측면에서 C# 내의 클래스와 변수 등을 처리할 수 있습니다
참조(hatena (diary ’Nobuhisa)) 다음 파일 만들기
python 호출
Callpython.cs
public class CallPython : MonoBehaviour {
    // Use this for initialization
    void Start () {
        TestPython test = new TestPython();
        TestComponent componentPython = GameObject.Find("TestObject").GetComponent<TestComponent>();
        private int num = 2; //同スコープ内ならprivate型でも呼び出せる

        var script = Resources.Load<TextAsset>("test").text;
        var scriptEngine = IronPython.Hosting.Python.CreateEngine();
        var scriptScope = scriptEngine.CreateScope();

        scriptScope.SetVariable("TestPython",test);                //testクラスをTestPythonとしてpythonで扱えるようにする
        scriptScope.SetVariable("TestComponent",componentPython);  //GameObjectを扱うことも可能
        scriptScope.SetVariable("num", num);

        var scriptSource = scriptEngine.CreateScriptSourceFromString(script);

        scriptSource.Execute(scriptScope);
    }
}
TestPython.cs
public class TestPython : MonoBehaviour {
    private string title = "Hello Uniity";
    public string Title
    {
        get
        {
            return title;
        }
        set
        {
            title = value;
        }
    }

    public void ShowTitle()
    {
        Debug.Log(title);
    }

}
TestComponet.cs
public class TestComponent : MonoBehaviour {
    [SerializeField]
    public string title;

    public void ShowTitle()
    {
        Debug.Log(title);
    }
}

python 사이드 프로그램
test.txt
import clr
clr.AddReferenceByPartialName('UnityEngine')
import UnityEngine
from UnityEngine import *

def call_unity():
    Debug.Log(TestComponent.title)      #インスペクターに登録されてあるパラメータの確認
    Debug.Log(TestPython.Title)         #TestPython内の変数の中身を確認
    TestPython.Title = "Hello Python"   #TestPython内の変数の中身を書き換える
    TestPython.ShowTitle()              #関数呼び出し
    Debug.Log("num is " + str(num))     #

call_unity()
유니티 방면에서 다음과 같이 실시하다
1. 테스트 대상 생성
2. TestObject에서 TestComponentcs 추가
3. 추가된 Test Component.검사기에서 cs 제목 다시 쓰기

실행 결과

※ 참고로python 측에서 C#측 클래스를 처리하면'그런 변수가 없습니다'오류가 발생합니다.
#!/usr/bin/env python

import clr
clr.AddReferenceByPartialName('UnityEngine')
import UnityEngine
from UnityEngine import *

def call_unity():
    testObject = GameObject.Find("TestObject")
    testScript = testObject.GetComponent<TestPython>()

    Debug.Log("[Python] Title is " + testScript.Title());


call_unity()
UnboundNameException: global name 'TestPython' is not defined
IronPython.Runtime.Operations.PythonOps.GetVariable (IronPython.Runtime.CodeContext context, System.String name, Boolean isGlobal, Boolean lightThrow)
IronPython.Compiler.LookupGlobalInstruction.Run (Microsoft.Scripting.Interpreter.InterpretedFrame frame)
Microsoft.Scripting.Interpreter.Interpreter.Run (Microsoft.Scripting.Interpreter.InterpretedFrame frame)

python 외부 라이브러리 사용하기


따라서,python 방면에서libsvm를 처리하려고 합니다
참조 와----!!!
아무도 모르는 비망록
순탄치 않다.ironpython은libsvm를 지원하지 않는 것 같습니다.

ironpython에서python 실행


subprocess는popen만 지원하는 것 같습니다.

기타


ironpython에서는 C#에서 만든 dll 파일참고 자료을 읽을 수 있습니다.

참고 자료


공식.
인터넷 블로그 선생님

좋은 웹페이지 즐겨찾기