Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

IronPython in Unity3D

Tags:

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!") 
like image 725
LunchMarble Avatar asked Aug 01 '12 19:08

LunchMarble


People also ask

Is IronPython still active?

Microsoft abandoned IronPython (and its sister project IronRuby) in late 2010, after which Hugunin left to work at Google. The project is currently maintained by a group of volunteers at GitHub.

Can you use Python in unity3d?

Python for Unity facilitates Unity's interaction with various media and entertainment industry applications and ensures that you can integrate Unity into a broader production pipeline seamlessly.

How do you update IronPython?

Just download the newest version from http://ironpython.net and follow the instructions from the msi package.


1 Answers

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:

enter image description here

like image 103
LunchMarble Avatar answered Sep 20 '22 06:09

LunchMarble