IronPython in Unity3D

匿名 (未验证) 提交于 2019-12-03 02:46:02

问题:

I am trying to use IronPython as an external scripting language for Unity3D. The necessary DLLs for IronPython's execution load just fine inside of Assets\Plugins. However, when I try to run the script I get this error:

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> 

The script and the 'UnityEngine.dll' are located in the same folder. This is the script:

import clr clr.LoadAssemblyFromFile("UnityEngine.dll")  import UnityEngine from UnityEngine import *  Debug.Log("Hello World from Python!") 

回答1:

So from a Unity script:

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

And inside of a python script (mine was apple.py located in the same folder as the game.exe):

import UnityEngine from UnityEngine import *  Debug.Log("Hello From IronPython!") 

Edit #1

I should note that the reason I was getting an error before was because the runtime version was specified as a 4.0 instead of a 3.5 or lower.

Edit #2

If you need to access your scripts from IronPython, then you can load your assembly as well by doing:

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

Then to use it in script:

import MyPlayerScriptOrSomething 

Note that you do not have to do the LoadAssembly for every script, just once to get the assembly.

Edit #3

The IronPython DLLs should be placed in a "Plugins" folder somewhere under "Assets" (most simply: Assets->Plugins. Here is my setup:

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

Edit #4

Your scripts can be put anywhere your program has access to them. For instance, if you wanted to place "apple.py" directly under "C:\", you could execute that file by doing:

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

Edit #5

The version I am using is:



文章来源: IronPython in Unity3D
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!