Для особо извращённых, кому не нравится gdscript но нравится python, кратко хотелось бы рассказать, как делать в Godot всякое при помощи своего любимого языка. Поехали!

Окружение: win, сборка игры под платформу: win. Предполагается что python (>= 3.7) и pip уже установлены.

Ставим нужную версию годота

Плагин для поддержки python сейчас идёт только на 3.x версии. Разработчики для свежих версий Godot 4.x пока что релиз не составили, по их словам они активно к этому идут. Что-ж, скачиваем последнюю доступную 3.x версию по ссылке.

На момент написания статьи актуальная 3.x версия: 3.6

Ставим Godot_v3.6-stable_win64.exe.zip

Разархивируем и запустим наш движок. Создаём новую папку и проект.

Устанавливаем расширение для Godot

Поддержка python поставляется вместе с расширением (или "аддоном", как вам угодно).

Наверху выбираем AssetLib и в поисковой строке набираем python.

Устанавливаем расширение
Устанавливаем расширение

Выбираем расширение и нажимаем "загрузить". Как только все файлы загрузятся и откроется установщик пакетов, ничего не трогая нажимаем "установить".

Пошёл процесс
Пошёл процесс

По сути скачивается модифицированный интерпретатор python. Радоваться можно только когда движок вам сказал что аддон успешно установился:

Ура!
Ура!

После этого потребуется перезапустить движок!

Тестируем

Это не статья про то, как пользоваться godot, поэтому здесь менее подробно:

Создадим простую сцену, сохраним как main.tscn, в качестве теста сделаем простую игру, в которой можно будет нажимать на 1 кнопку. Добавляем корневой узел Control, к нему дочерний Button а далее Label. Напишем простой скрипт, который будет менять текст сообщения после каждого нажатия кнопки. Нажимаем правой кнопкой мыши в дереве узлов сцены на узел Button и выбираем "Прикрепить скрипт". В появившемся окошке выбираем язык и устанавливаем имя создаваемого скрипта отличное от стандартного:

Язык - python
Язык - python

Открываем созданный файл в любом удобном редакторе, и печатаем что-то наподобие следующего:

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

Хм, число действительно простое. SymPy не врёт!
Хм, число действительно простое. SymPy не врёт!

Теперь начинаются танцы с бубнами. Помните ранее упоминалось, что скачивается модифицированный 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))

Сохраняем, запускаем, проверяем: действительно, после нажатия на кнопку меняется текст.

823 в принципе похоже на простое
823 в принципе похоже на простое

Прекрасная игра для математиков получилась!

Экспорт проекта

К несчастью, на момент написания статьи автоматический экспорт проекта со всеми зависимостями немного невозможен, поэтому некоторые вещи придётся сделать руками.

Для начала экспортируем как умеем:

Для тех, кто ни разу в жизни этого не делал, надо тыкнуть сюда
Для тех, кто ни разу в жизни этого не делал, надо тыкнуть сюда

Как упоминалось в начале статьи, будем экспортировать игру на 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.

Кто бы мог подумать что это будет настолько сложно
Кто бы мог подумать что это будет настолько сложно

Полезные ссылки


Всем спасибо за внимание.

Комментарии (3)


  1. Recosh
    18.12.2024 22:07

    О, создал на этом движке визуализатор который через скрипт прослойку берет координаты и ориентацию из мавлинка. Теперь можно прослойку прямо в godot закинуть.

    Но я на 4ой версии... Очень ждём. Момент с экспортом прям костыль...


  1. BosonBeard
    18.12.2024 22:07

    Хорошая статья, только вчера думал что надо примерно такую же написать, но вы опередили)


  1. DizzyRide
    18.12.2024 22:07

    Спасибо. Godot отличный движок, нужно больше статей по нему. Завтра плюсану, сегодня голоса закончились из-за любителей сливать карму.

    Я на C++ под Godot писал, потому что в моем случае нужна была максимальная производительность и многопоточность. GDScript хорош, но в некоторых случаях не тянет очень интенсивные вычисления в реальном времени. Поэтому Си++ с компиляцией непосредственно в инструкции процессора и параллельным выполнением на всех ядрах. Хотел даже статью о своем опыте написать, да расхотелось потом.