Tôi đã tìm ra cách để làm điều này. Như tôi dự đoán, vì IronPython biên dịch thành CLR, các đối tượng C # và IronPython có thể tương tác với nhau tốt mà không cần điều trị đặc biệt. Tôi đã tạo một tập lệnh thực sự tạo ra một loại Thành phần mới có thể được tham chiếu tốt từ C #.
Một từ ngắn gọn về cấu trúc trò chơi của tôi: Giải pháp của nó có hai dự án: Game và GameEngine. Trò chơi là thứ cuối cùng được biên dịch thành EXE và GameEngine được biên dịch thành một DLL nằm trong cùng thư mục.
Kịch bản
Điều này hiện đang nằm trong dự án nội dung mặc định, không có hành động xây dựng và được sao chép vào thư mục đầu ra.
Lưu ý rằng lớp Thành phần là một phần của GameEngine và do đó được biên dịch thành GameEngine.dll . Nó cũng không liên quan gì đến lớp GameComponent của XNA và các phương thức của nó không cần phải thông qua một đối tượng 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()
Kịch bản được biên dịch và chạy như thế nào
Chỉ một lần trong trò chơi, tôi chạy nó:
// 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);
Khi tập lệnh được thực thi, nó tạo ra một thể hiện riêng của PyComponent.
Tất nhiên, bạn sẽ cần tham khảo thư viện IronPython và thời gian chạy Microsoft Dynamic. Tôi đã tìm thấy tôi chỉ cần bốn DLL này từ thư mục gốc của bản tải xuống IronPython:
- IronPython.dll
- IronPython.Modules.dll
- Microsoft.Docate.dll
- Microsoft.Scripting.dll
Thêm các tham chiếu này vào dự án của bạn, sau đó các using
câu lệnh này vào mã của bạn (theo Nhúng IronPython trong Ứng dụng C # ):
using IronPython.Hosting;
using IronPython.Runtime;
using Microsoft.Scripting;
using Microsoft.Scripting.Hosting;
Lấy tham chiếu đến đối tượng Python
Tôi không chắc chắn làm thế nào tôi có được một tài liệu tham khảo trực tiếp từ kịch bản, nhưng tôi có cách làm việc đó. Trong thiết kế động cơ của tôi, tất cả các thành phần sẽ tự động đăng ký với bộ sưu tập thành phần của động cơ, vì vậy tôi có thể có được một tham chiếu đến đối tượng thông qua đó. Trong một trường hợp cụ thể hơn, bạn có thể có các đối tượng Python mới tự đăng ký với một hàng đợi ở đâu đó, vì vậy bạn tạo chúng và sau đó lấy chúng ngay lập tức.