私はこれを行う方法を理解しました。予想どおり、IronPythonはCLRにコンパイルされるため、C#オブジェクトとIronPythonオブジェクトは、特別な処理を必要とせずに、相互に問題なく対話できます。C#から正常に参照できる新しいタイプのコンポーネントを実際に作成するスクリプトを作成しました。
私のゲームの構造について簡単に説明します。その解決策には、ゲームとゲームエンジンの2つのプロジェクトがあります。ゲームは最終的にEXEにコンパイルされるものであり、ゲームエンジンは同じディレクトリにあるDLLにコンパイルされます。
スクリプト
これは現在、デフォルトのコンテンツプロジェクトにあり、ビルドアクションはなく、出力ディレクトリにコピーされます。
ComponentクラスはGameEngineの一部であるため、GameEngine.dllにコンパイルされることに注意してください。また、XNAのGameComponentクラスとは関係がなく、そのメソッドにGameTimeオブジェクトを渡す必要はありません。
import clr
clr.AddReferenceToFileAndPath("GameEngine.dll")
from GameEngine import *
# or: from GameEngine import Component
class PyComponent(Component):
def __new__(self):
Component.__new__(self)
def Initialize(self):
pass
def Update(self):
pass
def Draw(self):
pass
pc = PyComponent()
スクリプトをコンパイルして実行する方法
ゲーム内で1回だけ実行します。
// Engine setup stuff. The scope can work with variables in the script by
// adding references, accessing/removing current references, etc.
// Each script COULD have its own scope but I have no reason to do that yet.
ScriptEngine PythonEngine = Python.CreateEngine();
ScriptScope DefaultScope = PythonEngine.CreateScope();
string filename = @"Content\ScriptTest.py";
ScriptSource script = PythonEngine.CreateScriptSourceFromFile(filename, Encoding.ASCII);
script.Execute(scope);
スクリプトが実行されると、PyComponentの独自のインスタンスが作成されます。
もちろん、IronPythonライブラリとMicrosoft Dynamicランタイムを参照する必要があります。IronPythonダウンロードのルートフォルダーにあるこれらの4つのDLLのみが必要であることがわかりました。
- IronPython.dll
- IronPython.Modules.dll
- Microsoft.Dynamic.dll
- Microsoft.Scripting.dll
これらの参照をプロジェクトに追加し、次にこれらのusing
ステートメントをコードに追加します(C#アプリケーションへのIronPythonの埋め込みによると)。
using IronPython.Hosting;
using IronPython.Runtime;
using Microsoft.Scripting;
using Microsoft.Scripting.Hosting;
Pythonオブジェクトへの参照を取得する
スクリプトから直接参照を取得する方法がわかりませんが、それを回避する方法はあります。私のエンジン設計では、すべてのコンポーネントが自動的にエンジンのコンポーネントコレクションに登録されるため、そこからオブジェクトへの参照を取得できます。より具体的なケースでは、新しいPythonオブジェクトを自分自身をどこかのキューに登録させるだけでよいので、作成してすぐに取得します。