Для особо извращённых, кому не нравится gdscript но нравится python, кратко хотелось бы рассказать, как делать в Godot всякое при помощи своего любимого языка. Поехали!
Окружение: win, сборка игры под платформу: win. Предполагается что python (>= 3.7) и pip уже установлены.
Ставим нужную версию годота
Плагин для поддержки python сейчас идёт только на 3.x версии. Разработчики для свежих версий Godot 4.x пока что релиз не составили, по их словам они активно к этому идут. Что-ж, скачиваем последнюю доступную 3.x версию по ссылке.
На момент написания статьи актуальная 3.x версия: 3.6
Разархивируем и запустим наш движок. Создаём новую папку и проект.
Устанавливаем расширение для Godot
Поддержка python поставляется вместе с расширением (или "аддоном", как вам угодно).
Наверху выбираем AssetLib
и в поисковой строке набираем python
.
Выбираем расширение и нажимаем "загрузить". Как только все файлы загрузятся и откроется установщик пакетов, ничего не трогая нажимаем "установить".
По сути скачивается модифицированный интерпретатор python. Радоваться можно только когда движок вам сказал что аддон успешно установился:
После этого потребуется перезапустить движок!
Тестируем
Это не статья про то, как пользоваться godot, поэтому здесь менее подробно:
Создадим простую сцену, сохраним как main.tscn
, в качестве теста сделаем простую игру, в которой можно будет нажимать на 1 кнопку. Добавляем корневой узел Control
, к нему дочерний Button
а далее Label
. Напишем простой скрипт, который будет менять текст сообщения после каждого нажатия кнопки. Нажимаем правой кнопкой мыши в дереве узлов сцены на узел Button
и выбираем "Прикрепить скрипт". В появившемся окошке выбираем язык и устанавливаем имя создаваемого скрипта отличное от стандартного:
Открываем созданный файл в любом удобном редакторе, и печатаем что-то наподобие следующего:
from godot import exposed
from godot import *
@exposed
class ButtonPy(Button):
label: Label
def _ready(self):
self.label = self.get_node("Label")
self.connect("pressed", self, "button_pressed")
def button_pressed(self):
self.label.text = "another text"
Пока что просто меняем текст. Запускам, нажимаем на кнопку, любуемся результатом:
На самом деле программировать так будет очень сложно без подсветки синтаксиса и без подсказок редактора. Поэтому вот как надо настроить путь до python интерпретатора в VS Code: <path\to\new_godot_proj>\addons\pythonscript\windows-64\python.exe
. Умный VS Code сразу подскажет вам какие методы доступны.
Импорт пакетов
Всё это нужно ради чего? Ради импорта pip-пакетов, конечно же. Иначе мы бы не затевали весь этот сыр-бор, в python есть великое множество пакетов, а в Godot вместе с ними можно творить невероятные вещи!
Сейчас мы попробуем использовать один из них - SymPy в качестве примера.
Для начала протестируем пакет на нашем компьютере, а не в годот. Откроем терминал и установим пакет:
pip install sympy
Если не хотите засорять свою систему, ставьте в заранее созданный venv. Далее при помощи строки интерпретатора проверим работу нашего пакета, нас интересует получение случайного простого числа в заданном промежутке:
python
from sympy import *
randprime(0, 1000)
Мне выдало 443, проверить что число действительно простое можно через любой онлайн калькулятор, я возьму https://allcalc.ru/node/809
Теперь начинаются танцы с бубнами. Помните ранее упоминалось, что скачивается модифицированный python? Теперь нам надо ему сказать, чтобы он поставил себе этот пакет.
Переходим в папку проекта и выполняем следующие действия:
addons\pythonscript\windows-64\python.exe -m ensurepip
Это поставит pip рядом с вашим интерпретатором. После этого аналогичным образом можно ставить любые пакеты:
addons\pythonscript\windows-64\python.exe -m pip install sympy
Всё. Теперь пакет установлен и мы можем вернуться к движку, чтобы проверить, работает ли он в Godot.
Поменяем немного наш имеющийся скрипт: будем каждый раз показывать случайное простое число:
from godot import exposed
from godot import *
from sympy import *
@exposed
class ButtonPy(Button):
label: Label
def _ready(self):
self.label = self.get_node("Label")
self.connect("pressed", self, "button_pressed")
def button_pressed(self):
self.label.text = str(randprime(0, 1000))
Сохраняем, запускаем, проверяем: действительно, после нажатия на кнопку меняется текст.
Прекрасная игра для математиков получилась!
Экспорт проекта
К несчастью, на момент написания статьи автоматический экспорт проекта со всеми зависимостями немного невозможен, поэтому некоторые вещи придётся сделать руками.
Для начала экспортируем как умеем:
Как упоминалось в начале статьи, будем экспортировать игру на windows64, для этого надо добавить предустановку экспорта, выбрав нужный пункт. Скачайте и установите нужные шаблоны экспорта (в Godot они скачиваются отдельно от движка), если ещё не успели это сделать ранее. В меню настроек экспорта ничего трогать не надо, просто нажимаем "Экспортировать PCK/Zip", указываем место, где сохранить, флаг включения отладки можно оставить нетронутым. Не забудьте дать имя архиву, а то создастся файл .zip
. Далее распаковываем архив.
Теперь возвращаемся в место, где хранился наш проект Godot, и берём всю папку addons и копируем в место, где лежит билд. В addons\pythonscript
есть лишние папки которые мы скопировали, они относятся к другим платформам, их можно удалить оставив лишь windows-64
. Структура билда получится примерно такой:
* ButtonPy.py
* icon.png
* main.tscn
* ...
- addons/
- pythonscript/
- windows-64/
* python.exe
* ...
Нетрудно увидеть, что здесь не хватает собственно запускаемого exe-шника.
Нам как раз осталось скопировать 1 exe-шник из шаблонов экспорта в папку нашей сборки.
Шаблоны экспорта на win хранятся по этому адресу: %APPDATA%\Godot\templates\
(в этом месте хранятся шаблоны для всех версий Godot, нас интересует версия 3.6.stable
). Мы не трогали флаг отладки и оставили его включённым, а значит нам надо скопировать 1 файл из 3.6.stable\windows_64_debug.exe
прямиком в папку со сборкой игры.
Всё. Чтобы запустить игру выполняем именно windows_64_debug.exe
в папке с игрой.
Результат
Простенькая игра, написанная на Godot с использованием python-библиотеки sympy.
Полезные ссылки
К вопросу о шифровании контента: https://github.com/touilleMan/godot-python/issues/146
Репозиторий плагина: https://github.com/touilleMan/godot-python
Репозиторий godot: https://github.com/godotengine/godot
Сборка godot из исходников: https://habr.com/ru/articles/697634/
Всем спасибо за внимание.
Комментарии (3)
BosonBeard
18.12.2024 22:07Хорошая статья, только вчера думал что надо примерно такую же написать, но вы опередили)
DizzyRide
18.12.2024 22:07Спасибо. Godot отличный движок, нужно больше статей по нему. Завтра плюсану, сегодня голоса закончились из-за любителей сливать карму.
Я на C++ под Godot писал, потому что в моем случае нужна была максимальная производительность и многопоточность. GDScript хорош, но в некоторых случаях не тянет очень интенсивные вычисления в реальном времени. Поэтому Си++ с компиляцией непосредственно в инструкции процессора и параллельным выполнением на всех ядрах. Хотел даже статью о своем опыте написать, да расхотелось потом.
Recosh
О, создал на этом движке визуализатор который через скрипт прослойку берет координаты и ориентацию из мавлинка. Теперь можно прослойку прямо в godot закинуть.
Но я на 4ой версии... Очень ждём. Момент с экспортом прям костыль...