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の標準モジュールも使えるようにします。

まずIronPythonLibフォルダをtest.pyと同じフォルダにコピーします。

f:id:tkitao:20150528210026p:plain

次にtest.pyPythonのモジュール検索パスに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パッケージを読み込み、時刻を表示してみました。

動作を確認する

実際に動作を確認してみます。

f:id:tkitao:20150528210031p:plain

前回同様地味なアウトプットですが、無事標準パッケージが使えることが確認できました。

終わりに

2回にわたってUnity上でPythonを使用する方法を解説してみました。時期は未定ですが、そのうちUnity+Pythonならではの面白いことをやってみようと思います。GWに戻りたい…。