2012-08-01 98 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