2012-08-01 11 views
20

Estoy tratando de usar IronPython como un lenguaje de scripting externo para Unity3D. Los DLL necesarios para la ejecución de IronPython se cargan bien dentro de Assets \ Plugins. Sin embargo, cuando trato de ejecutar el script me sale este error:IronPython en Unity3D

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> 

El guión y la 'UnityEngine.dll' se encuentran en la misma carpeta. Este es el script:

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

import UnityEngine 
from UnityEngine import * 

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

Como curiosidad: ¿por IronPython? –

+0

Me permite trabajar con Unity3D que está construido sobre Mono.NET –

+1

Unity3d admite Boo desde el primer momento, que es bastante similar a Python; Me pregunto por qué estás acotando IronPython allí específicamente. –

Respuesta

17

Así que desde un script Unidad:

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

Y dentro de un script en Python (mina fue apple.py encuentra en la misma carpeta que el Game.exe):

import UnityEngine 
from UnityEngine import * 

Debug.Log("Hello From IronPython!") 

Edición # 1

deben tener en cuenta que la razón por la que estaba recibiendo un error antes era porque la versión de tiempo de ejecución fue s pecificado como 4.0 en vez de 3.5 o más bajo.

Edición # 2

Si necesita acceder a las secuencias de comandos de IronPython, entonces usted puede cargar su montaje, así haciendo:

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

Luego de usar de él en escritura:

import MyPlayerScriptOrSomething 

Tenga en cuenta que no tiene que hacer LoadAssembly para cada script, solo una vez para obtener el ensamblado.

Edición # 3

Las DLL IronPython se deben colocar en una carpeta "Plug-ins" en algún lugar bajo "Activos" (más simplemente:. Assets-> Plugins Aquí está mi configuración:

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

Editar # 4

las secuencias de comandos se pueden poner en cualquier lugar que su programa tiene acceso a ellos, por ejemplo, si se quería colocar "apple.py" directamente bajo. "C: \", se podría ejecutar ese archivo realizando:

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

Edición # 5

La versión que estoy usando es:

enter image description here

+0

¿Fuiste capaz de ejecutar scripts de Python mientras usabas Unity en modo de desarrollo (antes de que hubieras construido un ejecutable). Estoy tratando de averiguar dónde colocar el IronPython.dll (supongo que Library/ScriptAssemblies) y dónde colocar mis archivos python. Cualquier sugerencia sería genial. – desimusxvii

+0

@desimusxvii Actualicé la publicación original para reflejar las respuestas a su pregunta. –

+0

@StormKiernan usaste Python2.6 para .NET 2.0? Estoy tratando de reproducir esto, pero sin mucha suerte :) – RadiantHex