我试图使用IronPython为C#/ XNA游戏编写脚本引擎,但遇到了问题。

public class Game1 : Game, IGFXEnabledGame
{
    //stuff
}


Game1构造函数中,我需要对脚本进行必要的初始化,然后运行它以创建Camera对象。我尝试将以下硬编码的Camera初始化移至脚本:

CCamera camera = new CFPPCamera(this);


CCamera是抽象类,并且CFPPCamera从其继承。 CFPPCamera具有以下构造函数:

public CFPPCamera(Game game)
    : base(game)
{
}


脚本初始化:

InitScriptPath = "InitScript.py";
rootDir = AppDomain.CurrentDomain.BaseDirectory;
scriptDir = Path.Combine(rootDir, "Scripts");
scriptEngine = Python.CreateEngine();
scriptRuntime = scriptEngine.Runtime;
scriptScope = scriptRuntime.CreateScope();
scriptSource = scriptEngine.CreateScriptSourceFromFile(Path.Combine(scriptDir, InitScriptPath));
scriptScope.SetVariable("this", this);
scriptSource.Execute(scriptScope);


脚本代码:

import clr
clr.AddReference('Microsoft.Xna.Framework')
clr.AddReference('Microsoft.Xna.Framework.Game')
clr.AddReferenceToFile("../../../../../GFXEngine/bin/x86/Debug/GFXEngine.dll")

import Microsoft.Xna.Framework
from GFXEngine.GFX.Camera import *
from GFXEngine.GFX import *

camera = CFPPCamera(this);


代码编译时没有警告或错误,但是在脚本执行时出现错误:


  Unable to cast object of type 'RenderingStreamTesting.Game1' to type GFXEngine.GFX.IGFXEnabledGame'.'


如果我不将Camera生成传递给脚本,则一切正常。

RenderingStreamTestingGFXEngine是同一解决方案中的两个项目,其中RenderingStreamTestingGFXEngine引用的基础游戏项目。

从我发现的问题可能是由于引用不同的程序集引起的。我仔细检查,所有引用均指向本机.NET .dll,所有第三方库均列在公共目录中。

我想念什么?

最佳答案

可能是AddReferenceToFile调用。您很可能最终会将同一程序集加载到多个加载程序上下文中。如果XNA在GAC中,则建议将GFXEngine放入GAC或将其与入口点EXE放在同一目录中,并使用AddReference。这样,所有内容都应加载到同一上下文中。

10-06 03:56