unity调用python步骤
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コードの動作を確認できました。
==================================================
徐々に仕事が忙しくなってきました。GWに戻りたい…。
今回は前回の続きで、プロジェクト外部のPythonコードを読み込んで実行する方法について解説してみたいと思います。前回との差分のみ説明しますので、未読の方は前回の記事からお読みください。
Unityでプロジェクト外部にあるPythonコードを動かす方法
Pythonコードを外部ファイルとして読み込みIronPythonで実行することで、Unityを外部ファイルからコントロールすることができます。それにより、ゲームリリース後にユーザーがゲームを拡張するといったことが可能になります。
外部のPythonコードを読み込む
まずは外部のPythonコードを読み込むために、前回作成したC#コードを以下に置き換えます。
using UnityEngine;
using System.Collections;
using System.IO;
public class PythonLoader : MonoBehaviour
{
void Start()
{
string script;
var filename = Application.dataPath + "/../../test.py";
using (StreamReader sr = new StreamReader(filename, System.Text.Encoding.UTF8))
{
script = sr.ReadToEnd();
}
var scriptEngine = IronPython.Hosting.Python.CreateEngine();
var scriptScope = scriptEngine.CreateScope();
var scriptSource = scriptEngine.CreateScriptSourceFromString(script);
scriptSource.Execute(scriptScope);
}
}
ここではStreamReaderクラスを使用して、Application.dataPathの2階層上にあるtest.pyファイルを読み込んで実行しています。
Application.dataPathについて
ちなみにUnityのApplication.dataPathプロパティは実行環境によって指し示す場所が以下のように異なります。
| プラットフォーム | フォルダ |
|---|---|
| Unity Editor | プロジェクトフォルダ/Assets/ |
| Mac | アプリ/Contents/ |
| Windows | 実行ファイル(exeファイル)のあるフォルダ/exeファイル名_Data/ |
今回は、Application.dataPathの2階層上を参照していますので、test.pyファイルの置き場所は次のようになります。
| プラットフォーム | フォルダ |
|---|---|
| Unity Editor | プロジェクトフォルダが置いてあるフォルダ |
| Mac | アプリの置いてあるフォルダ |
| Windows | 実行ファイル(exeファイル)の置いてあるフォルダ |
Pythonの標準モジュールを使用する
これで外部のPythonスクリプトが実行できるようになったのですが、併せてPythonの標準モジュールも使えるようにします。
まずIronPythonのLibフォルダをtest.pyと同じフォルダにコピーします。

次にtest.pyでPythonのモジュール検索パスにLibフォルダを追加します。
import clr
clr.AddReferenceByPartialName('UnityEngine')
import UnityEngine
import sys
sys.path.append(UnityEngine.Application.dataPath + '/../../Lib')
import datetime
def print_message():
UnityEngine.Debug.Log('Test message from Python!')
UnityEngine.Debug.Log(datetime.datetime.today())
print_message()
今回は確認のため、datetimeパッケージを読み込み、時刻を表示してみました。
動作を確認する
実際に動作を確認してみます。

前回同様地味なアウトプットですが、無事標準パッケージが使えることが確認できました。
終わりに
2回にわたってUnity上でPythonを使用する方法を解説してみました。時期は未定ですが、そのうちUnity+Pythonならではの面白いことをやってみようと思います。GWに戻りたい…。

浙公网安备 33010602011771号