2012-08-01 30 views
20

Ich versuche IronPython als eine externe Skriptsprache für Unity3D zu verwenden. Die notwendigen DLLs für die Ausführung von IronPython laden sich gut in Assets \ Plugins. Aber wenn ich versuche, um das Skript auszuführen bekomme ich diesen Fehler:IronPython in 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> 

Das Skript und die ‚UnityEngine.dll‘ sind im selben Ordner befindet. Dies ist das Skript:

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

import UnityEngine 
from UnityEngine import * 

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

Aus Interesse: warum Ironpython? –

+0

Es ermöglicht mir, mit Unity3D zu arbeiten, die auf Mono.NET aufgebaut ist –

+1

Unity3d unterstützt Boo aus der Box, die ziemlich nah an Python ist; Ich frage mich, warum du gerade IronPython drin hast. –

Antwort

17

So von einem Unity-Skript:

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

Und innerhalb eines Python-Skript (mein apple.py im selben Ordner wie die game.exe gelegen war):

import UnityEngine 
from UnityEngine import * 

Debug.Log("Hello From IronPython!") 

Edit # 1

ich darauf hingewiesen, dass der Grund, warum ich wurde, bevor ein Fehler immer war, da die Runtime-Version s war pecified als 4.0 statt 3.5 oder niedriger.

Edit # 2

Wenn Sie Ihre Skripte von Ironpython zugreifen müssen, dann können Sie Ihre Montage als auch laden, indem Sie:

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

Dann ist es in Skript zu verwenden:

import MyPlayerScriptOrSomething 

Beachten Sie, dass Sie das LoadAssembly nicht für jedes Skript nur einmal ausführen müssen, um die Assembly zu erhalten.

Edit # 3

Die Ironpython-DLLs sollte irgendwo unter "Assets" (am einfachsten in einem Ordner "Plugins" platziert werden. Aktiv-> Plugins Hier ist mein Setup:

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

bearbeiten # 4

Ihre Skripte können überall dort abgelegt werden, wo Ihr Programm Zugriff hat.Wenn Sie zum Beispiel "apple.py" direkt unter "C: \" platzieren möchten, können Sie diese Datei folgendermaßen ausführen:

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

Edit # 5

Die Version ich verwende ist:

enter image description here

+0

Konnten Sie Python-Skripte ausführen, während Sie Unity im Entwicklungsmodus (vor der Erstellung) verwendet haben eine ausführbare Datei). Ich versuche nur herauszufinden, wo die IronPython.dll (ich nehme Library/ScriptAssemblies) und wohin ich meine Python-Dateien setzen soll. Irgendwelche Hinweise wären großartig. – desimusxvii

+0

@desimusxvii Ich habe den ursprünglichen Beitrag aktualisiert, um die Antworten auf Ihre Frage zu reflektieren. –

+0

@StormKiernan hast du Python2.6 für .NET 2.0 benutzt? Ich versuche, dies zu reproduzieren, aber ohne viel Glück :) – RadiantHex