Unity上でPythonを使う①【アセット組み込み編】
ここ最近、ちょこちょこいじっているUnityネタです。
今回は2回に分けてUnity上でPythonを使う方法について書いてみたいと思います。1回目の今日はPythonコードをアセットに組み込んで動かす方法について解説します。
Unityでアセットに組み込んだPythonコードを動かす方法
PythonのC#実装であるIronPythonを利用することで、Unity上でPythonコードを動かすことができます。IronPythonはMacとWindowsに両対応しているので、同じプロジェクトのまま両プラットフォームで動作します。
以下、動作手順です。
IronPythonを取得する
IronPythonは公式サイトのダウンロードページから取得できます。最新バージョンのバイナリ版であるIronPython 2.7.5 Binariesをダウンロードして、適当な場所に展開してください。
UnityのアセットにIronPythonを組み込む
続いてUnityのアセットにIronPythonを組み込みます。
IronPythonのPlatforms/Net35
フォルダにある以下の6つのdllファイルを、
UnityのアセットにPlugins
フォルダを作成して、ドラッグ&ドロップで登録してください。
Unityのプロジェクト設定を変更する
組み込んだIronPythonが動作するようにプロジェクトの設定を変更します。
Edit
→Project Settings
→Player
メニューからPlayerSettings
インスペクターを開き、
Optimization
セクションにあるApi Compatibility Level
を.NET 2.0
に設定します。
Pythonコードをアセットに追加する
いよいよPythonコードを作成します。今回はアセットに組み込むので、後述のスクリプトをtest.txt
という名前で作成し、アセットにResources
フォルダ作成して、そこにドラッグ&ドロップで登録します。
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
の指定は不要です。
動作を確認する
実際にプロジェクトを動かしてみます。
地味なアウトプットですが、Pythonコードの動作を確認できました。
終わりに
今回はアセットに組み込む形でPythonコードを動かしてみました。アセットに組み込むと実行時にコードを編集することができないため、あまり面白みがありません。そこで、次回はUnityから外部のPythonファイルを読み込んで動かしてみたいと思います。