2012-08-01 118 views
20

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

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!") 
+0

出于兴趣:为什么IronPython的? – 2012-08-02 15:23:05

+0

它允许我使用基于Mono.NET构建的Unity3D – 2012-08-02 15:49:45

+1

Unity3d支持Boo开箱即用,它非常接近Python;我想知道为什么你特意在那里嵌入IronPython。 – 2012-08-03 07:17:30

回答

17
从团结脚本

所以:

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

我要指出,我之前得到一个错误的原因是因为运行时版本得s认定为4.0而不是3.5或更低。

编辑#2

如果您需要从IronPython的访问你的脚本,那么你可以通过执行加载程序集,以及:

import MyPlayerScriptOrSomething 

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

然后在脚本中使用它

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

编辑#3

IronPython的DLL文件应该被放置在“插件”文件夹下的“资产”的地方(最简单的:资产 - >插件这里是我的设置:

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

编辑#4

你的脚本可以随时随地把你的程序可以访问他们举例来说,如果你想把它放到“apple.py”直属“C:\”,你可以通过做执行该文件:

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

编辑#5

我使用的版本是:

enter image description here

+0

当你在开发模式下使用Unity时,你能够运行python脚本可执行文件)。我只是想弄清楚把IronPython.dll放到哪里(我假设图书馆/ ScriptAssemblies)以及放置python文件的位置。任何提示都会很棒。 – desimusxvii 2013-02-02 23:44:22

+0

@desimusxvii我更新了原文,以反映您的问题的答案。 – 2013-02-13 21:10:37

+0

@StormKiernan您是否使用.NET 2.0的Python2.6?我试图重现这一点,但没有太多运气:) – RadiantHex 2013-07-20 14:20:08