C#/ XNAゲームでIronPythonコンポーネントと通信するにはどうすればよいですか?


8

私のXNAゲームはコンポーネント指向であり、位置、物理表現、レンダリングなどのさまざまなコンポーネントがあり、すべて基本Componentクラスを拡張しています。プレーヤーと敵にも、現在C#で定義されているコントローラーがあります。それらをIronPython(Pythonの.NET実装)を介してPythonスクリプトに変換したいと思います。私の問題は、これらのスクリプトの操作方法がわからないことです。

C#アプリケーションへのIronPythonの埋め込みの例は、Pythonスクリプトをコンパイルし、Pythonを介してコントローラーのUpdateメソッドを呼び出すスクリプトコンポーネントのようなものを作成する必要があることを示唆しています。 。

研究で何かが足りないように感じます。そこなければならないスクリプトをロードするための方法であること、(いずれかのC#のPythonスクリプト内または中)Pythonオブジェクトをインスタンス化して、その後、持っている直接私のC#コードでそのPythonオブジェクトへの参照を。

IronPythonオブジェクトを直接操作する方法はありますか、またはラッパーが必要ですか?

回答:


7

私はこれを行う方法を理解しました。予想どおり、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オブジェクトを自分自身をどこかのキューに登録させるだけでよいので、作成してすぐに取得します。


この投稿の最後の更新は、Pythonオブジェクトへの参照を直接取得する方法を見つけたときです。
doppelgreener
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.