Как использовать питон в юнити

Saved searches

Use saved searches to filter your results more quickly

You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session. You switched accounts on another tab or window. Reload to refresh your session.

Python plugin for Unity3D.

License

exodrifter/unity-python

This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Name already in use

A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?

Sign In Required

Please sign in to use Codespaces.

Launching GitHub Desktop

If nothing happens, download GitHub Desktop and try again.

Launching GitHub Desktop

If nothing happens, download GitHub Desktop and try again.

Launching Xcode

If nothing happens, download Xcode and try again.

Launching Visual Studio Code

Your codespace will open once ready.

There was a problem preparing your codespace, please try again.

Latest commit

Git stats

Files

Failed to load latest commit information.

README.md

This repository is no longer maintained. This repository will not be updated and I will not respond to support requests. There are a few reasons for why this is:

  • Python 2 was deprecated on January 1, 2020.
  • As of this writing, IronPython does not have a stable release for Python 3.
  • Updating to newer versions of IronPython for Python 2 does not appear to be straightforward as IronPython links against newer versions of DLLs that Unity uses.
  • pip dropped support for Python 2 in January 2021
  • I no longer use Unity.

This makes it difficult for me to keep the repository up to date and provide support. If you are interested in taking over, I would recommend putting your energy towards moving to Python 3 using IronPython 3 instead of continuing to use IronPython 2. Let me know if this is what you would like to do; I can provide some limited advice based on my experience making this library and I can redirect users to your library when it’s ready.

Читайте также:  Php create ini files

UnityPython is a plugin for Unity3D that provides support for running Python 2.x code in Unity3D on any platform which supports System.Reflection.Emit .

Special thanks to the developers of IronPython who developed the open-source integration of Python and .NET, which this plugin uses.

The build target must support System.Reflection.Emit . In the Unity3D docs, you can find an up-to-date detailed list of which platforms support Emit or not here.

As of Unity3D 2019.4 LTS, here is a chart of platform support for Emit :

Platform (scripting backend) Is System.Reflection.Emit supported?
Android (IL2CPP) No
Android (Mono) Yes
iOS (IL2CPP) No
PlayStation 4 (IL2CPP) No
PlayStation Vita (IL2CPP) No
Standalone (IL2CPP) No
Standalone (Mono) Yes
Switch (IL2CPP) No
Universal Windows Platform (IL2CPP) No
Universal Windows Platform (.NET) Maybe*
WebGL (IL2CPP) No
WiiU (Mono) Yes
XBox One (IL2CPP) No

* Unconfirmed, as Unity states that UWP (.NET) uses a «.NET Core class libraries subset» but fails to state what libraries are included in that subset. If you know the answer to this question, please open a PR.

There are three different ways to use this library in Unity:

  • Use the Add package from git URL. option in Unity’s package manager and use the git URL of this repository.
  • Clone this repository into your Unity project. Or, if your Unity project is already a git repository, add this repository as a submodule.
  • Download and install the latest .unitypackage release

Then, go to Edit > Project Settings > Player > Other Settings > Configuration and change Api Compatability Level to «.NET 4.x»

An example is provided below. More examples can be found in the Examples/ folder.

using UnityEngine; using IronPython.Hosting; public class HelloWorld : MonoBehaviour < void Start() < var engine = Python.CreateEngine(); var scope = engine.CreateScope(); string code = "str = 'Hello world!'"; var source = engine.CreateScriptSourceFromString(code); source.Execute(scope); Debug.Log(scope.GetVariable("str")); > > 

Источник

Из жизни разработчика

Порой бывает очень удобно использовать внешние скрипты, такие как Lua или Python в своем проекте.
Почему это удобно? И почему это может облегчить жизнь?

Ну к примеру в проекте есть места, где логика не так очевидна на первый взгляд (к примеру какое-то локальное поведение персонажей в каких-либо ситуациях) и могла бы быть имплементирована позже (и возможно другим программистом)
Или возможно дать некоторую свободу изменять или создавать дополнения к вашему продукту для сообщества фанатов.
Или к примеру ваш геймдизайнер постоянно пытается что-то поменять в проекте, и надоедливо жужжит о том, что надо бы перекомпилировать все к буям, только потому, что он что-то там поменял в настройках.
Да, можно (и нужно!) конечно выносить настройки объектов в игре в отдельные таблицы (например в те же гуглодоки), но иногда этого недостаточно. Приходится задумываться о том, чтобы была возможность менять логику программы, не прибегая к перекомпилированию всего проекта.

Читайте также:  Naming standard in java

Вот тут и приходит на помощь скриптовый язык.

В нашем проекте CASTROL RACE такой необходимости не было, но иногда я всё же задумывался применить тут данную технику. Ну а раз мысли такие меня начали посещать, да и появился свободный часик, я залез в интернет на поиски возможных готовых решений (честно говоря я копал в сторону Lua) и натолкнулся на бесплатный extension для Python.

Кому интересно, прошу под кат!

В Unity3d Store я наткнулся на реализацию Iron Python. Несмотря на то, что искал я Lua (с ней уже приходилось работать),
мне стало интересно и я решил попробовать. Тем более, что это абсолютно бесплатно.

2 клика мышью и проект уже открыт:

рис. 1 Проект изначально содержит все что нужно

Всё что требуется, так это настроить проект на использование .NET 2.0 в свойствах плеера. Об этом подробно написано в небольшой документации к экстеншену, так что не буду грузить мозг. Просто заходим в свойства проекта, далее в свойства плеера, там во вкладке other выбираем .NET 2.0 и сохраняем.

Нам сразу же доступна сцена с единственным объектом, к которому прицеплен скрипт.
Этот скрипт по сути просто представляет нам возможность посмотреть, как это работает.

рис. 2 Окно в демо проекте

Если запустить проект, то нам явится 2 окна:
— Сверху окно соджержит код на питоне, который можно прям тут же изменить
— Снизу окошко в которое выводится результат выполнения этого самого скрипта

Как можно заметить, скрипт, который уже вбит в верхнее окно, делает следующее — создает 5 сфер в сцене, дает им имена согласно номеру, и выводит строку «Created 5 spheres».
Если нажать на кнопку Run, то это и произойдёт! (:

Читайте также:  Php code quality tools

Вобщем, не долго играясь с верхним окном я полез в код.

Вот он инициализирует сам интерпретатор:

using UnityEngine; using System.Collections; /// /// A simple python behaviour that demonstrates how code can be ran in the runtime engine ///  public class InGamePythonInterpreter : MonoBehaviour  private string m_pyCode; private string m_pyOutput; private PythonEnvironment m_pyEnv; private const string INITIALIZATION_CODE = @" import clr clr.AddReference('UnityEngine') import UnityEngine "; // Use this for initialization void Start ()  m_pyEnv = new PythonEnvironment(); m_pyEnv.RunCommand(INITIALIZATION_CODE); m_pyOutput = string.Empty; > 
import clr clr.AddReference('UnityEngine') import UnityEngine

осуществляют связку среды Python c классами Unity3d. По сути, далее мы можем обращаться к классам Unity3d непосредственно из скриптов. Стоит отметить 2 момента:
— С одной стороны это очень удобно, поскольку не нужно экспортировать описание каждого класса как в Lua, ведь это запарно
— С другой стороны встает вопрос безопасности Ведь можно подсунуть другой скрипт и ничто не помешает ему внедриться в логику программы. Но это вопрос не к относится к сегодняшней теме (:

Итак, по нажатию на кнопку Run в сущности выполняется всего одна команда:

PythonEnvironment.CommandResult result = m_pyEnv.RunCommand(m_pyCode); 

RunCommand — гениально (: Эта команда просто выполняет текст скрипта!

Вроде бы как всё очень понятно и ясно.
Не имея четкой цели, я решил вынести скрипт в отдельный файл, далее скачать его во время работы программы и исполнить. Я добавил кнопку и следующий код:

WWW www = new WWW("http://www.yoursite.ru/_unity/script.py"); yield return www; PythonEnvironment.CommandResult result = m_pyEnv.RunCommand(www.data); 

Это сработало на ура! Теперь можно было запускать почти любую логику из этого скрипта, не прибегаю к перекомпиляции проекта. Цель достигнута.

PS: Должен отметить, что тут не рассматривались вопросы безопасности данного подхода
Также данная статья ни в коем случае не претендует на полноту рассмотрения проблемы использования сторонних интерпретируемых скриптов в Unity3d.

PPS: Был сделан небольшой сравнительный анализ производительности выполнения скрипта на Python и встроенного C#, разница приблизительно в 100 раз (медленнее конечно же). Для анализа скрипт в цикле 1000 раз создавал 2 вектора, отнимал из первого второй, и высчитывал магнитуду полученного.

Posted on May. 26th, 2011 at 06:04 pm | Link | Leave a comment | Share | Flag

Источник

Оцените статью