Unity上で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に戻りたい…。