IronPython在Unity3D中的应用

24

我正在尝试将IronPython作为Unity3D的外部脚本语言使用。IronPython执行所需的DLL在Assets\Plugins中加载得非常好。但是,当我尝试运行脚本时,出现以下错误:

PythonImportErrorException: No module named UnityEngine
IronPython.Modules.Builtin.__import__ (IronPython.Runtime.Calls.ICallerContext,string,object,object,object) <IL 0x0003b, 0x001cc>
(wrapper dynamic-method) object.__import__##5 (IronPython.Runtime.Calls.ICallerContext,object,object,object,object) <IL 0x0000e, 0x0004d>
IronPython.Runtime.Calls.FastCallableWithContextAny.Call (IronPython.Runtime.Calls.ICallerContext,object,object,object,object) <IL 0x00015, 0x00067>
IronPython.Runtime.Calls.BuiltinFunction.Call (IronPython.Runtime.Calls.ICallerContext,object,object,object,object) <IL 0x0000d, 0x00058>
IronPython.Runtime.Operations.Ops.CallWithContext (IronPython.Runtime.Calls.ICallerContext,object,object,object,object,object) <IL 0x00012, 0x000b0>
IronPython.Runtime.Importer.Import (IronPython.Runtime.PythonModule,string,IronPython.Runtime.List) <IL 0x0000d, 0x0006c>
IronPython.Runtime.Operations.Ops.Import (IronPython.Runtime.PythonModule,string) <IL 0x00007, 0x0003b>
(wrapper dynamic-method) object.<string>##1 (IronPython.Runtime.ModuleScope) <IL 0x0006b, 0x00210>

这个脚本和 'UnityEngine.dll' 位于同一个文件夹中。以下是该脚本:

import clr
clr.LoadAssemblyFromFile("UnityEngine.dll")

import UnityEngine
from UnityEngine import *

Debug.Log("Hello World from Python!")

2
Unity3d支持Boo编程语言,它与Python非常相似;我想知道为什么你特别要使用IronPython。 - Dan Puzey
6
Boo不是Python,语法不同,并且没有“电池包括”(标准库为您完成所有繁重工作)。几乎没有现有的Boo示例或代码片段。 - dirkjot
@SixS 你说得对,Unity文档中有例子。但是试着在那之外找到任何更大的例子:一无所获。看起来似乎没有人真正使用Boo。别忘了,“Boo不是Python”,它只是“受Python启发”或者什么的。 - dirkjot
@dirkjot:它包含了相当广泛的标准 .Net 库。 - BlueRaja - Danny Pflughoeft
2
Boo真的不是Python。而且它看起来相当死气沉沉。(我非常、非常地不喜欢它的C#式导入语句……当你将它们与Python的比较时,显然就会明白原因) - Jürgen A. Erhard
显示剩余4条评论
1个回答

19

那么从Unity脚本中:

PythonEngine engine = new PythonEngine();
engine.LoadAssembly(Assembly.GetAssembly(typeof(GameObject)));
engine.ExecuteFile("apple.py");

在一个Python脚本中(我的脚本名为apple.py,位于与game.exe相同的文件夹中):

import UnityEngine
from UnityEngine import *

Debug.Log("Hello From IronPython!")

编辑 #1

需要注意的是,我之前遇到错误的原因是指定的运行时版本为 4.0,而不是 3.5 或更低版本。

编辑 #2

如果需要从 IronPython 访问脚本,则可以通过以下方法加载程序集:

engine.LoadAssembly(Assembly.GetAssembly(typeof(MyPlayerScriptOrSomething)));

然后在脚本中使用它:

import MyPlayerScriptOrSomething

请注意,您不需要为每个脚本都执行LoadAssembly操作,只需要执行一次以获取程序集即可。

编辑#3

IronPython DLL应该放置在“Assets”下的某个“Plugins”文件夹中(最简单的方式是:Assets-> Plugins)。这是我的设置:

> Assets
> > Plugins
> > > IronMath.dll
> > > IronPython.dll
> > > Microsoft.Scripting.dll
> > > Microsoft.Scripting.Core.dll

编辑 #4

你的脚本可以放在程序有访问权限的任何地方。例如,如果你想把"apple.py"直接放在"C:\"下面,你可以执行以下命令来运行该文件:

engine.ExecuteFile(@"c:\apple.py");

第五次编辑

我使用的版本是:

在此输入图片描述


@desimusxvii,我更新了原帖以反映对你的问题的答案。 - LunchMarble
@StormKiernan 你使用的是Python2.6还是.NET 2.0?我也在尝试着复现,但没有什么进展 :) - RadiantHex
@StormKiernan,我的DLL似乎没有PythonEngine类,所以我无法调用LoadAssembrly。我得到了你之前遇到的相同错误。 - RadiantHex
@RadiantHex 我已经更新了我的帖子,附上了我所拥有的IronPython.DLL版本信息。 - LunchMarble
相关内容:https://theodox.github.io/2013/python_in_unity#.WPqsSIRcVBk.link 和 https://theodox.github.io/2013/unityrepl#.WPqtGUTnU4A.link - theodox
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接