Переход с Godot 3 на Godot 4

Стоит ли мне переходить на Godot 4?

Перед переходом, стоит подумать о преимуществах и недостатках, которые обновление принесет вашему проекту.

Преимущества обновления

Наряду с новыми функциями, представленными в версии 4.0, обновление дает следующие преимущества:

  • Многие ошибки исправлены в версии 4.0, и они не могут быть устранены в версии 3.x по разным причинам (например, из-за различий в графических API ).

  • 4.x будет иметь более длительный период поддержки . Godot 3.x будет продолжать поддерживаться в течение некоторого времени после выпуска 4.0, но в конечном итоге поддержка прекратится.

Список страниц, документирующих новые функции Godot 4.0, см. в История изменения документации, а список всех функций Godot — в Список функций.

Недостатки обновления

Если вам не нужны какие-либо функции Godot 4.х, вы можете остаться на Godot 3.x по следующим причинам:

  • Базовые требования к оборудованию Godot 4 (например, к использованию памяти) немного выше как для редактора, так и для экспортированных проектов. Это было необходимо для реализации некоторых основных оптимизаций.

  • Поскольку в Godot 4 больше функций, чем Godot 3, размер двоичного файла у проектов Godot 4 больше. Хотя его можно уменьшить, оптимизировав сборку по размеру , сборка 4.0 с заданным набором включенных модулей останется больше по сравнению со сборкой 3.x с теми же модулями. Это может быть проблемой при экспорте в Web , поскольку размер двоичного файла напрямую влияет на скорость загрузки движка (независимо от скорости интернета).

  • Godot 4 не поддерживает и не будет поддерживать рендеринг GLES2. (Все еще поддерживается рендеринг GLES3 с использованием нового рендерера Compatibility, что означает, что устройства без поддержки Vulkan по-прежнему могут запускать Godot 4.)

    • Если вы ориентируетесь на очень старое оборудование, например со встроенной графикой Intel Sandy Bridge (2-го поколения), это не позволит запустить проект на таком оборудовании после обновления. Можно использовать Программные реализации OpenGL для обхода этого ограничения, но они слишком медленны для игр.

Предостережения при обновлении

Поскольку Godot 4 во многих аспектах полностью переписан, некоторые функции, к сожалению, были удалены. Некоторые из этих функций могут быть восстановлены в будущих версиях Godot:

  • Физика Bullet была удалена в пользу GodotPhysics. Это касается только 3D-проектов, в которых использовался физический движок по умолчанию (это был Bullet) и не менялось вручную на GodotPhysics. Планов по повторному добавлению физики Bullet нет, но для этого можно создать стороннее дополнение благодаря GDExtension.

  • По умолчанию рендеринг в 2D больше не выполняется в HDR, что означает, что значения модуляции «overbright» не имеют видимого эффекта. Начиная с Godot 4.2, вы можете включить настройку проекта HDR 2D для выполнения 2D-рендеринга в HDR. См. также Использование свечения в 2D.

  • Хотя рендеринг все еще происходит в HDR в 3D при использовании рендереров Forward+ или Mobile, Viewports больше не может возвращать данные HDR. Это планируется восстановить в какой-то момент в будущем.

  • Mono был заменен на .NET 6. Это означает, что экспорт проектов на C# в Android, iOS и HTML5 на данный момент больше не поддерживается. Экспорт проектов на C# на настольные платформы по-прежнему поддерживается, а начиная с версии 4.2 появилась экспериментальная поддержка экспорта на мобильные платформы. Поддержка экспорта проектов на C# на большее количество платформ будет восстановлена в будущих версиях 4.x по мере улучшения поддержки вышестоящих версий.

Более полный список функциональных регрессий можно найти, выполнив поиск по запросу issues, помеченным как «регрессия», но не «ошибка» на GitHub.

Подготовка перед обновлением (необязательно)

Если в будущем вы захотите обновиться до Godot 4, подумайте об использовании Tweener и синглтона Time в вашем проекте. Эти классы оба доступны в Godot 3.5 и более поздних версиях.

Таким образом, вы не будете полагаться на устаревшие Tween узлы и временные функции OS, оба из которых удалены в Godot 4.0.

Также хорошей идеей будет переименовать внешние шейдеры так, чтобы их расширение было .gdshader вместо .shader. Godot 3.x поддерживает оба расширения, но в Godot 4.0 поддерживается только .gdshader.

Запуск инструмента обновления проекта

Опасно

Make a full backup of your project (Сделать полную резервную копию вашего проекта) перед обновлением! Инструмент обновления проекта не будет выполнять никаких резервных копий обновляемого проекта.

Вы можете сделать резервную копию проекта, используя систему управления версиями, или скопировать папку проекта в другое место.

Использование Менеджера Проектов

Чтобы использовать инструмент обновления проекта:

  1. Откройте Менеджер Проектов Godot 4.

  2. Для импорта проекта в Godot 3.x используйте кнопку Импорт, или кнопку Сканировать, чтобы найти проект в папке.

  3. Дважды нажмите по импортированному проекту (или выберите проект и нажмите Редактировать).

  4. Вы увидите диалоговое окно с двумя вариантами: Конвертировать только project.godot и Конвертировать весь проект. Убедившись, что резервное копирование проекта выполнено (см. вышеприведенное предупреждение), выберите Конвертировать весь проект. Конвертировать только project.godot предназначен для использования в расширенных случаях использования только, в случае сбоя инструмента конвертации.

  5. Дождитесь окончания процесса конвертации проекта. Для больших проектов с множеством сцен это может занять до нескольких минут.

  6. Когда интерфейс Менеджера Проектов станет доступным снова, дважды щелкните по проекту (или выберите проект, после чего нажмите Редактировать), чтобы открыть его в редакторе.

Если у вас возникли проблемы с преобразованием из-за того, что некоторые файлы проекта слишком большие или длинные, вы можете использовать командную строку для обновления проекта (см. ниже). Это позволит вам обойти ограничения по размеру преобразователя.

Использование командной строки

Чтобы использовать инструмент для обновления проекта из command line, рекомендуется проверить преобразование проекта, запустив бинарный файл редактора Godot со следующими аргументами:

# [<max_file_kb>] [<max_line_size>] are optional arguments.
# Remove them if you aren't changing their values.
path/to/godot.binary --path /path/to/project/folder --validate-conversion-3to4 [<max_file_kb>] [<max_line_size>]

Если список запланированных обновлений вас устраивает, выполните следующую команду на двоичном файле редактора Godot для обновления файлов проекта:

# [<max_file_kb>] [<max_line_size>] are optional arguments.
# Remove them if you aren't changing their values.
path/to/godot.binary --path /path/to/project/folder --convert-3to4 [<max_file_kb>] [<max_line_size>]

''[<max_file_kb>]'' и ''[<max_line_size>]'' являются необязательными аргументами для указания максимального размера файлов для преобразования (в килобайтах и строках). По умолчанию ограничения составляют 4 МБ и 100 000 строк соответственно. Если файл достигает любого из этих ограничений, он не будет обновлен конвертером проектов. Это полезно для предотвращения замедления обновления до обхода больших ресурсов.

Если вы по-прежнему хотите, чтобы большие файлы конвертировались с помощью средства обновления проекта, увеличьте ограничения размера при запуске средства обновления проекта. Например, запуск двоичного файла редактора Godot с этими аргументами увеличивает оба лимита на 10× множитель:

path/to/godot.binary --path /path/to/project/folder --convert-3to4 40000 1000000

Примечание

Только проекты Godot 3.0 и более поздние версии могут быть обновлены с помощью инструмента преобразования проектов, найденного в редакторе Godot 4.

Перед запуском инструмента обновления проекта рекомендуется убедиться, что ваш проект обновлен до последней стабильной версии 3.x.

Починка проекта после запуска инструмента обновления проекта

После обновления проекта вы можете заметить, что некоторые вещи выглядят не так, как должны. Скрипты также могут содержать различные ошибки (в больших проектах их могут быть сотни). Это связано с тем, что инструмент обновления проекта не может удовлетворить все ситуации. Таким образом, большая часть процесса обновления остается ручной.

Автоматически переименованные узлы и ресурсы

Список ниже содержит узлы, которые были переименованы для согласованности и ясности в Godot 4.0. Инструмент обновления проектов переименовывает их автоматически в ваших скриптах.

Один примечательный набор переименований - это 3D-узлы, которые все получили суффикс 3D для согласованности с их 2D-аналогами. Например, Area теперь называется Area3D.

Для облегчения поиска, таблица ниже перечисляет все узлы и ресурсы, которые были переименованы и автоматически преобразованы, исключая те, которые просто получили суффикс 3D к старому имени:

Старое название (Godot 3.x)

Новое название (Godot 4)

AnimatedSprite

AnimatedSprite2D

ARVRCamera

XRCamera3D

ARVRController

XRController3D

ARVRAnchor

XRAnchor3D

ARVRInterface

XRInterface

ARVROrigin

XROrigin3D

ARVRPositionalTracker

XRPositionalTracker

ARVRServer

XRServer

BoxShape

BoxShape3D

CapsuleShape

CapsuleShape3D

CubeMesh

BoxMesh

EditorSpatialGizmo

EditorNode3DGizmo

EditorSpatialGizmoPlugin

EditorNode3DGizmoPlugin

GIProbe

VoxelGI

GIProbeData

VoxelGIData

GradientTexture

ГрадиентнаяТекстура1D

КинематическоеТело

ПерсонажТело3D

KinematicBоdy2D

ПерсонажТело2D

Свет2D

PointLight2D (Точечный свет 2d)

LineShape2D

WorldBoundaryShape2D (Мировая Граница Форма 2d)

Listener

AudioListener3D

NavigationMeshInstance (Навигационная сетка экземпляра)

NavigationRegion3D (Навигационная Область 3d)

NavigationPolygonInstance (Навигационный полигон экземпляр)

NavigationRegion2D (Навигационная Область 2d)

Navigation2DServer (Навигация 2D -сервер)

NavigationServer2D (Навигационный Сервер 2D)

PanoramaSky (Панорама Неба)

Sky

Particles (Частицы)

GPUParticles3D (Частицы Графического Процессора 3d)

Particles2D (Частицы 2D)

GPUParticles2D (Частицы графического процессора 2D)

ParticlesMaterial (Частицы Материал)

ParticleProcessMaterial (Материал процесса частиц)

Physics2DDirectBodyState (Физика 2D Прямого Состояния Тела)

PhysicsDirectBodyState2D (Физика прямого состояния тела 2d)

Physics2DDirectSpaceState

PhysicsDirectSpaceState2D

Physics2DServer

PhysicsServer2D (Физический сервер 2d)

Physics2DShapeQueryParameters

PhysicsShapeQueryParameters2D

Physics2DTestMotionResult

PhysicsTestMotionResult2D

PlaneShape

WorldBoundaryShape3D

Position2D

Marker2D

Position3D

Marker3D

ProceduralSky

Sky

RayShape

SeparationRayShape3D

RayShape2D

SeparationRayShape2D

ShortCut

Ярлык (Shortcut)

Spatial

Node3D

SpatialGizmo

Node3DGizmo

SpatialMaterial

StandardMaterial3D

Sprite

Sprite2D

StreamTexture

CompressedTexture2D

TextureProgress

TextureProgressBar

VideoPlayer

VideoStreamPlayer

ViewportContainer

SubViewportContainer

Viewport

SubViewport

VisibilityEnabler

VisibleOnScreenEnabler3D

VisibilityNotifier

VisibleOnScreenNotifier3D

VisibilityNotifier2D

VisibleOnScreenNotifier2D

VisibilityNotifier3D

VisibleOnScreenNotifier3D

VisualServer

RenderingServer

VisualShaderNodeScalarConstant

VisualShaderNodeFloatConstant

VisualShaderNodeScalarFunc

VisualShaderNodeFloatFunc

VisualShaderNodeScalarOp

VisualShaderNodeFloatOp

VisualShaderNodeScalarClamp

VisualShaderNodeClamp

VisualShaderNodeVectorClamp

VisualShaderNodeClamp

VisualShaderNodeScalarInterp

VisualShaderNodeMix

VisualShaderNodeVectorInterp

VisualShaderNodeMix

VisualShaderNodeVectorScalarMix

VisualShaderNodeMix

VisualShaderNodeScalarSmoothStep

VisualShaderNodeSmoothStep

VisualShaderNodeVectorSmoothStep

VisualShaderNodeSmoothStep

VisualShaderNodeVectorScalarSmoothStep

VisualShaderNodeSmoothStep

VisualShaderNodeVectorScalarStep

VisualShaderNodeStep

VisualShaderNodeScalarSwitch

VisualShaderNodeSwitch

VisualShaderNodeScalarTransformMult

VisualShaderNodeTransformOp

VisualShaderNodeScalarDerivativeFunc

VisualShaderNodeDerivativeFunc

VisualShaderNodeVectorDerivativeFunc

VisualShaderNodeDerivativeFunc

VisualShaderNodeBooleanUniform

VisualShaderNodeBooleanParameter

VisualShaderNodeColorUniform

VisualShaderNodeColorParameter

VisualShaderNodeScalarUniform

VisualShaderNodeFloatParameter

VisualShaderNodeCubeMapUniform

VisualShaderNodeCubeMapParameter

VisualShaderNodeTextureUniform

VisualShaderNodeTexture2DParameter

VisualShaderNodeTextureUniformTriplanar

VisualShaderNodeTextureParameterTriplanar

VisualShaderNodeTransformUniform

VisualShaderNodeTransformParameter

VisualShaderNodeVec3Uniform

VisualShaderNodeVec3Parameter

VisualShaderNodeUniform

VisualShaderNodeParameter

VisualShaderNodeUniformRef

VisualShaderNodeParameterRef

Ручное переименование методов, свойств, сигналов и констант

В силу особенностей работы инструмента обновления проекта, не все переименования API могут быть выполнены автоматически. В списке ниже представлены все переименования, которые необходимо выполнить вручную с помощью редактора сценариев.

Если вы не можете найти узел или ресурс в списке ниже, обратитесь к вышеуказанной таблице, чтобы найти его новое название.

Совет

Вы можете использовать диалоговое окно Заменить в файлах, чтобы ускорить замену, нажав Ctrl + Shift + R при открытом редакторе скриптов. Однако будьте осторожны, так как диалоговое окно "Заменить в файлах" не предлагает никакого способа отмены замены. Используйте систему контроля версий для регулярной фиксации работы по обновлению. Инструменты командной строки, такие как sd также могут быть использованы, если вам нужно что-то более гибкое, чем диалоговое окно "Заменить в файлах" в редакторе.

При использовании C# не забудьте найти устаревшее использование API с нотацией в стиле PascalCase в проекте (и выполнить замену с нотацией в стиле PascalCase).

Методы

  • Классы File и Directory были заменены на FileAccess и DirAccess которые имеют абсолютно другой API. Несколько методов теперь статичны, что означает, что вы можете вызвать их напрямую без создания экземпляра класса.

  • Методы связанные с экраном или окном из синглтона OS (такие как OS.get_screen_size()) были перемещены в синглтон DisplayServer. Именование методов также было измененно, чтобы иметь такую форму DisplayServer.<объект>_<get/set>_property(). Например, OS.get_screen_size() стал DisplayServer.screen_get_size().

  • Методы связанные со временем и датой были перемещены из синглтона OS в синглтон Time. (Синглтон Time также доступен в версии Godot 3.5 и старше.)

  • Вам стоит сменить вызовы функции instance() на instantiate(). Конвертор должен обработать это автоматически, но это зависит от кода, поэтому он может не всегда срабатывать.

  • Метод set_autowrap() у AcceptDialog теперь set_autowrap_mode().

  • Метод process()``у AnimationNode теперь называется ``_process() (помни, подчеркивание в начале означает, что метод виртуальный).

  • add_animation() в AnimationPlayer теперь называется add_animation_library() и теперь использует AnimationLibrary.

  • AnimationTree's set_process_mode() теперь set_process_callback().

  • Array's empty() теперь is_empty().

  • Array's invert() теперь reverse().

  • Array's remove() теперь remove_at().

  • Метод get_points() у AStar2D и AStar3D теперь называется get_points_id().

  • Метод set_event() у BaseButton теперь называется set_shortcut().

  • Camera2D's get_h_offset() теперь get_drag_horizontal_offset().

  • Метод get_v_offset() у Camera2D теперь называется get_drag_vertical_offset().

  • Camera2D's set_h_offset() теперь set_drag_horizontal_offset().

  • Метод set_v_offset() у Camera2D теперь называется set_drag_vertical_offset().

  • CanvasItem's raise() теперь move_to_front().

  • Метод update() у CanvasItem теперь называется queue_redraw().

  • Control's get_stylebox() теперь get_theme_stylebox().

  • Метод set_tooltip() у Control теперь называется set_tooltip_text().

  • Метод create_gizmo() у EditorNode3DGizmoPlugin теперь называется _create_gizmo() (подчеркивание у метода в начале означает то, что метод виртуальный).

  • Метод get_peer_port() у ENetMultiplayerPeer теперь называется get_peer().

  • Метод get_mode() у FileDialog теперь называется get_file_mode().

  • Метод set_mode() у FileDialog теперь называется set_file_mode().

  • Метод get_offset() у GraphNode теперь называется get_position_offset().

  • Метод map_to_world() у GridMap теперь называется map_to_local().

  • Метод world_to_map() у GridMap теперь называется local_to_map().

  • Метод get_rect() у Image теперь называется get_region().

  • ImmediateGeometry's set_normal() теперь surface_set_normal().

  • ImmediateMesh's set_color() теперь surface_set_color().

  • ImmediateMesh's set_uv() теперь surface_set_uv().

  • Метод get_v_scroll() у ItemList теперь называется get_v_scroll_bar().

  • Метод get_network_connected_peers() у MultiPlayerAPI теперь называется get_peers().

  • Метод get_network_peer() у MultiPlayerAPI теперь называется get_peer().

  • Метод get_network_unique_id() у MultiPlayerAPI теперь называется get_unique_id().

  • Метод has_network_peer() у MultiPlayerAPI теперь называется has_multiplayer_peer().

  • MultiplayerAPI's is_refusing_new_network_connections() теперь is_refusing_new_connections().

  • Метод is_listening() у PacketPeerUDP теперь называется is_bound().

  • Метод listen() у PacketPeerUDP теперь называется bind().

  • Метод set_flag() у ParticleProcessMaterial теперь называется set_particle_flag().

  • PhysicsTestMotionResult2D's get_motion() теперь get_travel().

  • RenderingServer's get_render_info() теперь get_rendering_info().

  • Метод get_dependencies() у ResourceFormatLoader теперь называется _get_dependencies() (помни, нижнее подчеркивание в начале метода, означает то, что он виртуальный).

  • ResourceFormatLoader's load() теперь _load().

  • Метод change_scene() у SceneTree теперь называется change_scene_to_file().

  • Метод is_valid() у Shortcut теперь называется has_valid_event().

  • Метод map_to_world() у TileMap теперь называется map_to_local().

  • Метод world_to_map() у TileMap теперь называется local_to_map().

  • У Transform2D методы xform() и xform_inv() возвращают соответственно mat * vec и vec * mat.

  • XRPositionalTracker's get_name() теперь get_tracker_name().

  • XRPositionalTracker's get_type() теперь get_tracker_type().

  • XRPositionalTracker's _set_name() теперь get_tracker_name().

Свойства

Примечание

Если свойство указано здесь, то ассоцированный геттер и сеттер должны быть переименованы в ручную в проекте. Например, у PathFollow2D и PathFollow3D методы set_offset() и get_offset() должны быть переименованы в set_progress() и get_progress() соответственно.

  • Устройство AudioServer теперь output_device.

  • BaseButton's group теперь button_group.

  • Camera3D's zfar теперь far.

  • Camera3D's znear теперь near

  • Переменная margin теперь называется offset.

  • doubleclick для InputEventMouseButton теперь называется double_click.

  • alt в InputEventWithModifiers теперь alt_pressed.

  • command InputEventWithModifiers теперь называется command_pressed.

  • control InputEventWithModifiers теперь ctrl_pressed.

  • meta InputEventWithModifiers теперь имеет значение meta_pressed.

  • shift в InputEventWithModifiers теперь shift_pressed.

  • Свойство percent_visible теперь называется visible_ratio.

  • У MultiPlayerAPI refuse_new_network_connections теперь refuse_new_connections.

  • Node's filename теперь scene_file_path.

  • PathFollow2D's rotate теперь rotates.

  • У PathFollow2D и PathFollow3D offset теперь progress.

  • RectangleShape2D's extents теперь size

  • У TextureProgressBar percent_visible теперь show_percentage.

  • Флажок off темы теперь unchecked.

  • Theme's ofs теперь offset.

  • Theme's on теперь checked.

  • Window's window_title теперь title.

  • WorldMarginShape2D's d теперь distance.

  • Свойство extents в узлах CSG и VoxelGI придется заменить на size, при этом установленное значение будет уменьшено вдвое (поскольку они больше не являются половинными экстентами). Это также влияет на его методы set/get set_extents() и get_extents().

  • Свойство Engine.editor_hint удалено в пользу метода Engine.is_editor_hint(). Это было сделано поскольку оно только для чтения, а свойства в Godot не могут быть только для чтения.

Перечисления

  • У CPUParticles2D FLAG_MAX теперь PARTICLE_FLAG_MAX.

Сигналы

  • У FileSystemDock instantiate теперь instance.

  • У CanvasItem hide теперь hidden. Это переименование не применяется к методу hide(), только к сигналу.

  • У Tween tween_all_completed теперь loop_finished.

  • У EditorSettings changed теперь settings_changed.

Константы

  • Названия цветов теперь написаны большими буквами и используют нижнее подчеркивание между словами. Для примера, Color.palegreen теперь Color.PALE_GREEN.

  • Константы NOTIFICATION_ у MainLoop были скопированы в Node что означает что вы можете удалить префикс MainLoop. при ссылке на них.

  • У MainLoop NOTIFICATION_WM_QUIT_REQUEST теперь NOTIFICATION_WM_CLOSE_REQUEST.

Проверка настроек проекта

Несколько настроек проекта было переименовано, и некоторые из них имеют изменения в перечислениях нарушающих совместимость (например качество фильтра теней). Это означает что вам нужно установить некоторые настройки проекта заново. Убедитесь что Расширенные настройки включены в диалоге настроек проекта, так чтобы вы видели все настройки.

Проверка параметров Окружения

Настройки качества графики были перемещены из свойств Environment (Окружения) в настройки проекта. Это было сделано для того, чтобы упростить корректировку качества выполнения, без необходимости доступа к текущему активному ресурсу Environment и изменения его свойств.

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

Если в вашем проекте есть меню настройки графики которое изменяет свойства окружения в Godot 3.x, вам нужно изменить его код для вызова методов RenderingServer которые влияют на качество эффектов окружения. Только "базовый" переключатель каждого эффекта окружения и его визуальное отображение остается в ресурсе Окружения.

Обновление шейдеров

В шейдерах произошли некоторые изменения, которые не покрываются инструментом обновления. Вам нужно будет внести некоторые изменения вручную, особенно если ваш шейдер использует преобразования координатного пространства или пользовательскую функцию light().

Расширение файла .shader больше не поддерживается, что означает что вы должны переименовать файлы .shader в .gdshader и обновить соответствующие ссылки в файлах сцены/ресурсов использую внешний текстовый редактор.

Вот некоторые важные изменения, которые вам нужно будет внести в шейдеры:

  • Фильтр текстур и режимы повтора теперь должны устанавливаться на индивидуальных uniforms, а не на файлах текстур.

  • hint_albedo теперь source_color.

  • hint_color``теперь``source_color.

  • Built in matrix variables were renamed.

  • Шейдеры частиц больше не используют функцию vertex(). Вместо этого они используют start() и process().

  • В рендерах Forward+ и Mobile нормализованные координаты устройства теперь имеют Z-диапазон [0.0,1.0] вместо [-1.0,1.0]. При реконструкции NDC из SCREEN_UV и глубины используйте vec3 ndc = vec3(SCREEN_UV * 2.0 - 1.0, глубина); вместо vec3 ndc = vec3(SCREEN_UV, глубина) * 2.0 - 1.0;. Рендер совместимости не изменился, используя тот же Z-диапазон NDC, что и 3.x.

  • Изменилась модель освещения. Если в вашем шейдере есть пользовательская функция light(), вам может потребоваться внести изменения, чтобы получить тот же визуальный результат.

  • В версии 4.3 и выше теперь реализована техника обратного буфера глубины Z, которая может сломать расширенные шейдеры. См. Введение в обратный Z (AKA Извините за поломку вашего шейдера).

См. Язык шейдеров для получения более подробной информации.

Этот список не является исчерпывающим. Если вы внесли все изменения, упомянутые здесь, и ваш шейдер все еще не работает, попробуйте обратиться за помощью в один из каналов сообщества.

Обновление скриптов с учетом изменений, несовместимых с предыдущими версиями

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

Самые важные примеры этого:

  • Функции жизненного цикла такие как _ready() и _process() больше не вызывают неявно функции родительских классов которые имеют то же имя. Вместо этого, вы должны использовать super() в начале вашей функции жизненного цикла в классе потомка так, чтобы родительская функция вызывалась первой.

  • И String и StringName теперь есть в GDScript. Это обеспечивает большую оптимизацию, т.к. StringName специально создан, чтобы быть использованым как константная строка, которая будет создаваться один раз и переиспользоваться много раз. Эти типы не строго эквивалентны друг другу, это означает что is_same("example", &"example") возвращает false. Хоть и в большинстве случаев они взаимозаменяемы ("example" == &"example" возвращает true), но иногда вы можете заменить "example" на &"example".

  • синтаксис геттеров и сеттеров в GDScript был изменен, но он был конвертирован только частично конвертационным инструментом. В большинстве случаев, изменения в ручную необходимы для того, чтобы сеттеры и геттеры работали снова.

  • Синтаксис подключения сигнала GDScript был изменен. Инструмент преобразования будет использовать синтаксис на основе строк, которые все еще присутствуют в Godot 4, но рекомендуется переключиться на синтаксис на основе Signal, описанный на связанной странице. Таким образом, строки больше не используются, что позволяет избежать проблем с ошибками имен сигналов, которые можно обнаружить только во время выполнения.

  • Встроенные скрипты tool scripts не получат конвертацию ключевого слова tool в аннотацию @tool.

  • Узел Tween был удален ради Tweeners, который также доступен в Godot 3.5 и более старших версиях. Посмотрите original pull request.

  • randomize() теперь автоматически вызывается при загрузке проекта, так что детерминированная рандомизация глобального экземпляра RandomNumberGenerator требует ручной установки сида в скриптовой функции _ready().

  • call_group(), set_group() и notify_group() теперь применяются мгновенно по умолчанию. При вызове на большой функции, это может привести к замедлению если используется с группой из большого числа узлов. Для использования отложенных вызовов как прежде, замените call_group(...) на call_group_flags(SceneTree.GROUP_CALL_DEFERRED, ...) (а также сделайте то же самое с set_group() и notify_group() соответственно).

  • Вместо rotation_degrees, свойство rotation было открыто в редакторе, оно автоматически показывается в градусах в панели Инспектора. Это может сломать анимации, так как конвертация не обрабатывается автоматически утилитой конвертации.

  • У AABB метод has_no_surface() был инвертирован и переименован в has_surface().

  • У AABB и Rect2 метод has_no_area() был инвертирован и переименован в has_area().

  • У AnimatedTexture свойство fps было заменено на speed_scale, которое работает также, как и свойство playback_speed у AnimationPlayer.

  • У AnimatedSprite2D и AnimatedSprite3D теперь свойство speed_scale может иметь отрицательные значения. Это может сломать анимации если вы надеялись, что speed_scale всегда будет больше 0.

  • У AnimatedSprite2D и AnimatedSprite3D удалено свойство playing. Используйте методы play()/stop() вместо ИЛИ настройте autoplay анимацию через нижнюю панель Кадры спрайта (но не оба одновременно).

  • У Array второй параметр (end) метода slice() исключает последний элемент, вместо того, чтобы включать его. Например, это означает, что [1, 2, 3].slice(0, 1) теперь возвращает [1] вместо [1, 2].

  • Теперь сигналами BaseButton являются button_up и button_down. Свойство pressed теперь называется button_pressed.

  • У Camera2D свойство rotating было заменено на ignore_rotation, инвертированное поведение.

  • Свойство zoom у Camera2D было инвертировано. Теперь более высокие значения приближают вместо того, чтобы отдалять.

  • У Node метод remove_and_skip() был удален. Если вам нужно использовать его в скрипте используйте старую C++ реализацию.

  • OS.get_system_time_secs() стоит заменить на Time.get_time_dict_from_system()["second"].

  • В классе ResourceSaver у метода save() были переменены аргументы местами (resource: Resource, path: String). Это также относится к методу _save() у ResourceFormatSaver.

  • Класс StreamPeerTCP теперь имеет poll() вызываемый обновлением своего состояния, вместо зависимости от get_status() автоматического опроса: GH-59582

  • У метода right() класса String было изменено поведение <https://github.com/godotengine/godot/pull/36180>`__: теперь он возвращает число символов строки справа, а не с правой стороны строки из заданной позиции. Если вам нужно старое поведение, вы можете использовать substr() вместо.

  • is_connected_to_host() был удален из StreamPeerTCP и PacketPeerUDP в GH-59582. get_status() может использоваться в StreamPeerTCP вместо него. is_socket_connected() может использоваться в PacketPeerUDP вместо него.

  • В _get_property_list(), свойство строки подсказки or_lesser теперь or_less.

  • В _get_property_list()`, свойство строки подсказки ``noslider теперь no_slider.

  • VisualShaderNodeVec4Parameter теперь принимает параметр Vector4 вместо Quaternion.

Удаленные или замененные узлы/ресурсы

В этом списке указаны все узлы, которые были заменены другим узлом, требующим иной конфигурации. Настройку необходимо выполнить заново, так как конвертер проектов не поддерживает обновление существующих конфигураций:

Удаленный узел

Ближайший аналог

Комментарий

AnimationTreePlayer

AnimationTree

AnimationTreePlayer считается устаревшим с версии Godot 3.1.

BakedLightmap

LightmapGI

Посмотрите Использование глобального освещения LightmapGI.

BakedLightmapData

LightmapGIData

BitmapFont

FontFile

Посмотрите Использование Шрифтов.

DynamicFont

FontFile

DynamicFontData

FontFile

ClippedCamera

Camera2D или Camera3D

Пирамидальная форма камеры была перемещена в :ref:'class_Camera3D'.

InterpolatedCamera

Camera2D или Camera3D

Navigation2D

Node2D

Заменен на другие узлы 2D навигации.

Navigation3D

Node3D

Заменен на другие узлы 3D навигации.

OpenSimplexNoise

FastNoiseLite

Имеет другие параметры и больше типов шума таких как клеточный. Не поддерживает 4D шум т.к. он отсутствует в библиотеке FastNoiseLite.

ToolButton

Button

ToolButton был Button с включенным по умолчанию свойством Flat.

YSort

Node2D или Control

CanvasItem теперь имеет Y Sort Enabled свойство в версии 4.0.

ProximityGroup

Node3D

VisibleOnScreenNotifier3D может использоваться в качестве замены.

Portal

Node3D

Портал и комната окклюзивного куллинга были заменены на occlusion culling (узел OccluderInstance3D), которой требуется другой процесс настройки.

Room

Node3D

RoomManager

Node3D

RoomGroup

Node3D

Occluder

Node3D

Геометрический окллюзионный куллинг был заменен на растровый occlusion culling (узел OccluderInstance3D), который требует другой процесс настройки.

OccluderShapeSphere

Resource

При загрузке старого проекта, узел будет автоматически заменен на его Ближайший аналог (даже если не использовать утилиту обновления проекта).

Изменения многопоточности

API многопоточности был изменен в 4.0. Например, следующий фрагмент кода из Godot 3.x нужно изменить для работы в 4.0:

# 3.x
var start_success = new_thread.start(self, "__threaded_background_loader",
    [resource_path, thread_num]
)

# 4.0
var start_success = new_thread.start(__threaded_background_loader.bind(resource_path, thread_num))

Thread.is_active() больше не поддерживается и должен быть преобразован в Thread.is_alive().

См. также

Смотрите список изменений для получения полного списка изменений между версиями Godot 3.x и 4.

Нарушение обратной совместимости ресурса ArrayMesh

Если вы сохранили ресурс ArrayMesh в файл .res или .tres, формат используемый в 4.0 не совместим с тем что используется в 3.x. Вам нужно пройти через процесс импортирования исходного файла сетки и сохранить его как ресурс ArrayMesh снова.

Список автоматически переименованных методов, свойств, сигналов и констант

Файл исходного кода editor/renames_map_3_to_4.cpp содержит список всех автоматических переименований сделанных утилитой обновления проекта. Строки с комментариями отсылают к переименованиям API в cannot be performed automatically.

Перенос настроек редактора

Godot 3.x и Godot 4.0 используют разные файлы настроек редактора. Это означает то, что их настройки могут быть изменены независимо друг друга.

Если вы хотите перенести настройки с Godot 3.x на Godot 4, то откройте папку с настройками редактора и скопируйте editor_settings-3.tres в editor_settings-4.tres, в момент когда закрыт редактор Godot 4.

Примечание

Множество имен и категорий настроек было изменено со времен Godot 3.x. Настройки редактора чьи имена и категории были изменены не переносятся в Godot 4.0; вам нужно установить их значения заново.

Обновление настроек контроля версий

Godot 3.x и 4.x имеют совершенно разные списки файлов и папок, которые следует игнорировать version control system.