Это постоянно обновляющийся список основных изменений и «подводных камней», на которые следует обратить внимание при переходе на Godot 4.0.
Оглавление
Новые Названия
Одним из крупнейших изменений в Godot 4 является полное переименование — узлов, функций и имен свойств. Большая часть этого сделана для улучшения последовательности и ясности. Вот несколько из наиболее значительных, на которые стоит обратить внимание:
- Узлы 2D/3D — В Godot 3.x узлы 2D имели суффикс «2D», а ноды 3D не имели такого. Теперь у всех нод есть суффиксы «2D» или «3D». Например: RigidBody2D и RigidBody3D.
- Также в категории 3D узел Spatial переименован в Node3D для соответствия.
- Один из самых популярных узлов, KinematicBody, переименован в CharacterBody2D/CharacterBody3D.
- Функция instance() у PackedScene была переименована в instantiate().
- Свойства position и global_position заменяют translation и global_translation в 3D, что делает их согласованными с 2D.
Сигналы и Вызовы
Работа с сигналами более удобна в 4.0. Теперь Signal — это встроенный тип, поэтому вы будете использовать меньше строк, что означает уменьшение времени на проверку ошибок. То же самое относится и к функциям, на которые теперь можно прямо ссылаться.
Вот пример определения, подключения и вызова сигнала.
extends Node
signal my_signal
func _ready():
my_signal.connect(signal_handler)
func _input(event):
if event.is_action_pressed("ui_select"):
my_signal.emit()
func signal_handler():
print("signal received")
Твины
Если вы начали использовать SceneTreeTween в Godot 3.5, то вам будет знакомо использование Tween в Godot 4.0.
Tween больше не является узлом. Вместо этого вы создаете отдельные объекты анимации tween при необходимости. Как только вы к этому привыкнете, он станет гораздо более мощным и удобным в использовании методом по сравнению со старым.
AnimatedSprite[2D|3D]
Самое крупное изменение, которое смущает тех, кто знаком с версией этого узла 3.x, заключается в том, что свойство playing больше не существует. Чтобы автоматически воспроизвести анимацию, вы можете включить autoplay в панели SpriteFrames. В коде используйте play() и stop() для управления воспроизведением.
CharacterBody[2D|3D]
Самое крупное изменение в этом узле касается использования move_and_slide(). Теперь он не принимает никаких параметров — теперь все они являются встроенными свойствами. Среди них есть свойство native velocity, поэтому вам больше не нужно объявлять его самостоятельно.
TileMap
Узел TileMap полностью переработан в версии 4.0. Практически все, начиная от создания TileSets и заканчивая рисованием и взаимодействием с тайлами, на 100% новое.
Генератор случайных чисел (RNG)
Есть несколько изменений во встроенных функциях генерации случайных чисел в GDScript:
- Теперь вам не нужно вызывать randomize() — это происходит автоматически. Если вы хотите получить повторяемую «случайность», используйте seed() для установки заранее выбранного значения.
- Функция rand_range() теперь заменена на randf_range() (для чисел с плавающей точкой) или randi_range() (для целых чисел).
Raycasting
При использовании лучей в коде появился новый API. Теперь функция PhysicsDirectSpaceState[2D|3D].intersect_ray() принимает специальный объект в качестве параметра. Этот объект указывает свойства луча. Например, для использования луча в 3D:
var space = get_world_3d().direct_space_state
var ray = PhysicsRayQueryParameters3D.create(position, destination)
var collision = space.intersect_ray(ray)
if collision:
print("ray collided")