Наследование в Godot 4

4 minute read

Перевод статьи Inheritance in Godot 4 – Tutorial

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

Учебный проект

Создайте новый проект, перейдите в Scene > New Scene и создайте новую ноду типа Control. Для примера назовем эту ноду InheritanceTut. Для этого урока используются ассеты с kenney.nl, три головы животных мы будем использовать для демонстрации наследования. Добавьте их (или любые другие три изображения) в свой проект в папку с названием img. Создайте другую папку внутри вашего проекта и назовите ее inherited_scenes.

Как должен выглядеть результат:

Базовая сцена

Для демонстрации наследования в Godot 4 создадим базовую сцену. Выбираем в меню Scene > New Scene, тип ноды должен быть TextureRect. Это класс, который будет содержать общие функции, наследуемые другими классами. Назовите его “Animal” и в правой части окна в инспекторе измените Expand Mode на “Ignore Size”(игнорирование размера). Теперь добавьте скрипт к сцене.

Добавьте кнопку Button в сцену. Выберите эту кнопку и в Node > Signals привяжите сигнал pressed() к только что созданному скрипту.

Сделайте Animal и Button одинакового размера. Сцена должна выглядеть так:

Измените скрипт сцены, чтобы он выглядел так:

 1extends TextureRect
 2class_name Animal # Этот скрипт имеет отдельное название класса
 3
 4@export var color : String
 5@export var can_climb : bool
 6
 7func _on_button_pressed() -> void:
 8	print("Name: ", name)
 9	print("Color: ", color)
10	show_additional_info()
11	
12func show_additional_info() -> void:
13	print("ADDITIONAL INFORMATION:")
14	print("Can climb: ", can_climb)

Дочерние сцены

После создания базовой сцены, можно приступать к созданию дочерних сцен, которые будут наследоваться от базовой. Чтобы создать дочернюю сцену, просто щёлкните правой кнопкой мыши по “animal.tscn” в файловой системе и выберите New Inherited Scene. Альтернативно, можно выбрать в меню Scene > New Inherited Scene и после этого выбрать файл “animal.tscn”. В любом случае будет открыта новая сцена

Измените название сцены на “Monkey”. В инспекторе поменяйте значение переменной color на “brown” и can_climb на “true”. Затем поменяйте картинку в поле texture

Повторите шаги еще два раза и создайте дочерние сцены “Giraffe” и “Elephant”. Для жирафа выберите color “Yellow” и can_climb укажите “false”. Для слона укажите color “Grey” и can_climb укажите “false”. Для каждой сцены укажите нужное значение texture. Сохраните все сцены в папке inherited_scenes.

Наследование скриптов в Godot 4

Наследование скриптов позволяет создавать иерархию классов, в которой дочерние классы наследуют свойства и методы от родительских классов. Это означает, что вы можете определить общее поведение в родительском классе, а затем расширить это поведение в дочерних классах, сократив дублирование кода и упростив его поддержку и обновление. Этого можно добиться, создав иерархию классов с помощью ключевого слова extends. А чтобы создать новый класс, используйте ключевое слово class_name, как мы сделали с классом Animal.

Переопределение методов

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

Чтобы продемонстрировать наследование скриптов и переопределение методов, мы добавим новый скрипт в сцену “Elephant”. Для этого нажмите “Elephant”, а затем “Detach the script”. После этого добавим новый скрипт в сцену и сохраним “elephant.tscn”

Затем добавим в новый скрипт следующий код:

1extends Animal # make this scene inherit from our Animal class
2
3@export var has_trunk : bool
4
5func show_additional_info() -> void:
6	super.show_additional_info() # call the parent function
7	print("has trunk: ", has_trunk)

Убедитесь что вы указали все нужные настройки в инспекторе и выбрали правильную картинку

Вызовы суперметодов

В некоторых случаях вам может понадобиться вызвать метод базового класса в дочернем классе. Для этого используется ключевое слово super. Вызывая метод super, вы можете выполнить метод базового класса перед выполнением кода в дочернем классе. Например, мы переопределили метод show_additional_info(), но с помощью метода super.show_additional_info() мы можем вызвать исходную функцию.

Изменение базовой сцены

Ещё одним большим преимуществом является возможность изменять дочернюю сцену, изменяя базовую сцену. Посмотрим это на примере.

Вы можете заметить, что кнопка наложения немного темнее. Для этого изменим базовую сцену “animal.tscn”. Нажмите на Button и в разделе Visibility > Modulate, измените альфа-канал.

Сохраняем базовую сцену. Теперь вы можете проверить дочерние сцены и увидите, что все они изменили прозрачность.

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

Заключение

Добавьте все созданные сцены на главную сцену игры. Сохраните и запустите игру. Вы должны видеть что-то похожее на:

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