ひきぷろのプログラミング日記

プログラミングの日記です。

(Unity) Unity上でIronPythonを動かしてみた

Unity 上で IronPython を動かしてみました。
以下やり方です。

IronPython をインストールする

ironpython.codeplex.com

↑ このサイトから IronPython をダウンロードしてインストールしてください。
現時点ではバージョン 2.7.5 っぽいです。
おそらく、 msi 形式のインストーラしかダウンロードできないので、 Windows 上で作業する必要があると思います。

Unity の Assets フォルダに DLL をコピーする

  • Unity を起動してプロジェクトを作成してください。
  • Assets フォルダのすぐ下に Plugins フォルダを作成してください。
  • C:\Program Files (x86)\IronPython 2.7\Platforms\Net35 を開いて、次のファイルを Assets\Plugins にコピーしてください。

Console.Write(), Console.WriteLine() の実行時に Unity のコンソール上へログが出るように準備する

IronPython の DLL 内部で Console.Write() を呼び出すコードが書かれているようなんですが、 Unity のコンソールにログが表示されないので調整する必要があります。
次のようなクラスを準備しておいてください。

using UnityEngine;

public class DebugLogWriter : System.IO.TextWriter {
	public override void Write(string value)
	{
		base.Write(value);
		Debug.Log(value);
	}
	public override System.Text.Encoding Encoding
	{
		get { return System.Text.Encoding.UTF8; }
	}
}

C#Python 呼び出しコードを書く

次のようなスクリプトを書くと、 Python のコードが実行できるようです。

using UnityEngine;
using System.Collections;
using Microsoft.Scripting.Hosting;
using IronPython.Hosting;

public class Test : MonoBehaviour {

	// Use this for initialization
	void Start () {
		// Console.Write() を Debug.Log() と同じように使えるように設定する
		System.Console.SetOut(new DebugLogWriter());

		// IronPython の準備
		ScriptEngine engine = Python.CreateEngine();
		ScriptScope scope = engine.CreateScope();

		// 文字列から実行
		engine.Execute(@"
def hello():
    print 'hello, world !!!'
hello()
", scope);

		// ファイルから実行
		// engine.ExecuteFile("Assets/test.py", scope);
	}
	
	// Update is called once per frame
	void Update () {
	
	}
}

↑ このスクリプトを、シーン上の GameObject に張り付けると動きます。
こちらでは Unity 4.6.3f1 で正常に動きました。

参考リンク

■ Embedding IronPython in Unity = Tech-art hog heaven
http://techartsurvival.blogspot.jp/2013/12/embedding-ironpython-in-unity-tech-art.html