Unity上でPythonを使う①【アセット組み込み編】

ここ最近、ちょこちょこいじっているUnityネタです。

今回は2回に分けてUnity上でPythonを使う方法について書いてみたいと思います。1回目の今日はPythonコードをアセットに組み込んで動かす方法について解説します。

Unityでアセットに組み込んだPythonコードを動かす方法

PythonC#実装であるIronPythonを利用することで、Unity上でPythonコードを動かすことができます。IronPythonMacWindowsに両対応しているので、同じプロジェクトのまま両プラットフォームで動作します。

以下、動作手順です。

IronPythonを取得する

IronPython公式サイトダウンロードページから取得できます。最新バージョンのバイナリ版であるIronPython 2.7.5 Binariesをダウンロードして、適当な場所に展開してください。

UnityのアセットにIronPythonを組み込む

続いてUnityのアセットにIronPythonを組み込みます。

IronPythonPlatforms/Net35フォルダにある以下の6つのdllファイルを、

f:id:tkitao:20150518205647p:plain

UnityのアセットにPluginsフォルダを作成して、ドラッグ&ドロップで登録してください。

f:id:tkitao:20150518205657p:plain

Unityのプロジェクト設定を変更する

組み込んだIronPythonが動作するようにプロジェクトの設定を変更します。

EditProject SettingsPlayerメニューからPlayerSettingsインスペクターを開き、

f:id:tkitao:20150518210459p:plain

OptimizationセクションにあるApi Compatibility Level.NET 2.0に設定します。

f:id:tkitao:20150518210505p:plain

Pythonコードをアセットに追加する

いよいよPythonコードを作成します。今回はアセットに組み込むので、後述のスクリプトtest.txtという名前で作成し、アセットにResourcesフォルダ作成して、そこにドラッグ&ドロップで登録します。

f:id:tkitao:20150518214620p:plain

Unityにテキストアセットとして登録できる拡張子は特定の種類に限定されているので、Pythonコードを登録する際は拡張子.pyではなく.txtにすることに気をつけてください。

今回登録するPythonコードです。

#!/usr/bin/env python

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


def print_message():
    UnityEngine.Debug.Log('Test message from Python!')


print_message()

なお、Unity上で動かす際には必要ないのですが、コード編集の際にエディタにPythonコードであることを認識させるため、先頭行に#!(Shebang)をおまじないとして書いています。

Pythonコードを実行するスクリプトを追加する

最後にPythonコードを実行するC#のコードを作成します。

次のスクリプトを適当なGameObjectに追加してください。

using UnityEngine;
using System.Collections;

public class PythonLoader : MonoBehaviour
{
    void Start()
    {
        var script = Resources.Load<TextAsset>("test").text;
        var scriptEngine = IronPython.Hosting.Python.CreateEngine();
        var scriptScope = scriptEngine.CreateScope();
        var scriptSource = scriptEngine.CreateScriptSourceFromString(script);

        scriptSource.Execute(scriptScope);
    }
}

このコードではテキストアセットとして登録したPythonコードを読み込んで、IronPythonに渡しています。Loadメソッドでファイル名を指定する際は、拡張子.txtの指定は不要です。

動作を確認する

実際にプロジェクトを動かしてみます。

f:id:tkitao:20150518212318p:plain

地味なアウトプットですが、Pythonコードの動作を確認できました。

終わりに

今回はアセットに組み込む形でPythonコードを動かしてみました。アセットに組み込むと実行時にコードを編集することができないため、あまり面白みがありません。そこで、次回はUnityから外部のPythonファイルを読み込んで動かしてみたいと思います。