Attention: Here be dragons

This is the latest (unstable) version of this documentation, which may document features not available in or compatible with released stable versions of Godot.

Створення першого сценарію

У цьому уроці ви напишете свій перший скрипт, щоб значок Годо обертався по колу. Як ми вже згадували in the introduction, ми припускаємо, що у вас є основи програмування.

Цей посібник написано для GDScript, а еквівалентний код C# для зручності включено в окрему вкладку кожного блоку коду.

../../_images/scripting_first_script_rotating_godot.gif

Дивись також

Щоб дізнатися більше про GDScript, його ключові слова та синтаксис, перейдіть до розділу Скрипт. Щоб дізнатися більше про C#, перейдіть до розділу C#/.NET.

Налаштування проєкту

Будь ласка create a new project почати з чистого аркуша. Ваш проект має містити одне зображення: значок Godot, який ми часто використовуємо для створення прототипів у спільноті.

../../_images/scripting_first_script_icon.svg

Нам потрібно створити вузол Sprite2D для його відображення в грі. У доку Scene натисніть кнопку Other Node.

../../_images/scripting_first_script_click_other_node.webp

Введіть "Sprite2D" у рядку пошуку, щоб відфільтрувати вузли, і двічі клацніть на Sprite2D, щоб створити вузол.

../../_images/scripting_first_script_add_sprite_node.webp

Ваша вкладка Scene тепер повинна містити лише вузол Sprite2D.

../../_images/scripting_first_script_scene_tree.webp

Вузол Sprite2D потребує текстури для відображення. У Inspector праворуч ви можете побачити, що властивість Texture має значення <empty>. Щоб відобразити іконку Godot, клацніть і перетягніть файл icon.svg з дока FileSystem у слот Texture.

../../_images/scripting_first_script_setting_texture.webp

Примітка

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

Потім клацніть і перетягніть піктограму у вікні перегляду, щоб відцентрувати її в області перегляду гри.

../../_images/scripting_first_script_centering_sprite.webp

Створення нового сценарію

Щоб створити та приєднати новий скрипт до нашого вузла, клацніть правою кнопкою миші на Sprite2D у панелі сцени та виберіть Attach Script.

../../_images/scripting_first_script_attach_script.webp

З’явиться вікно Attach Node Script. Воно дозволяє вам вибрати мову скрипта та шлях до файлу, серед інших опцій.

Змініть поле Template з Вузол: За замовчуванням на Об'єкт: Порожній, щоб почати з чистого файлу. Залиште інші параметри встановленими за замовчуванням і натисніть кнопку Create, щоб створити скрипт.

../../_images/scripting_first_script_attach_node_script.webp

Примітка

Назви скриптів C# повинні збігатися з назвою класу. У цьому випадку файл слід назвати MySprite2D.cs.

Робоча область Script має з'явитися з відкритим вашим новим файлом sprite_2d.gd та наступним рядком коду:

extends Sprite2D

Кожен файл GDScript неявно є класом. Ключове слово extends визначає клас, який успадковує або розширює цей скрипт. У цьому випадку це Sprite2D, що означає, що наш скрипт отримає доступ до всіх властивостей і функцій вузла Sprite2D, включаючи класи, які він розширює, наприклад, Node2D, CanvasItem і Node.

Примітка

У GDScript, якщо ви пропустите рядок із ключовим словом extends, ваш клас неявно розширить клас RefCounted, який Godot використовує для керування пам’яттю вашої програми.

Успадковані властивості включають ті, які ви можете побачити в доці Inspector, як-от текстура нашого вузла.

Примітка

За замовчуванням Inspector відображає властивості вузла у "Title Case", слова з великої літери, розділені пробілом. У коді GDScript ці властивості відображаються у "snake_case", тобто у нижньому регістрі, де кожне слово розділене символом підкреслення.

Ви можете навести курсор на назву будь-якої властивості в Inspector, щоб побачити опис та її ідентифікатор у коді.

Привіт, всесвіт!

Наш скрипт наразі нічого не робить. Давайте змусимо його надрукувати текст "Привіт, світ!" до нижньої панелі виводу, щоб почати.

Додайте наступний код до свого сценарію:

func _init():
    print("Hello, world!")

Давайте розберемо його. Ключове слово func визначає нову функцію під назвою _init. Це спеціальна назва для конструктора нашого класу. Движок викликає _init() для кожного об'єкта або вузла після його створення в пам'яті, якщо ви визначаєте цю функцію.

Примітка

GDScript — це мова на основі відступів. Для того, щоб код працював, необхідна вкладка на початку рядка з текстом print(). Якщо ви пропустите його або неправильно відступите рядок, редактор виділить його червоним і відобразить таке повідомлення про помилку: «Очікується блок із відступом».

Збережіть сцену як sprite_2d.tscn, якщо ви ще цього не зробили, а потім натисніть F6 (Cmd + R на macOS), щоб запустити її. Подивіться на нижню панель Output, яка розгортається. На ній має з'явитися напис «Hello, world!».

../../_images/scripting_first_script_print_hello_world.webp

Видаліть функцію _init(), щоб у вас залишився лише рядок extends Sprite2D.

Обертання

Настав час змусити наш вузол рухатися і обертатися. Для цього ми додамо до нашого скрипта дві змінні-члени: швидкість руху в пікселях за секунду і кутову швидкість в радіанах за секунду. Додайте наступне після рядка extends Sprite2D.

var speed = 400
var angular_speed = PI

Змінні-члени розташовані у верхній частині скрипту, після всіх "extends", але перед функціями. Кожен екземпляр вузла з цим скриптом матиме власну копію властивостей speed та angular_speed.

Примітка

Кути в Godot за замовчуванням вказуються в радіанах, але ви маєте вбудовані функції та властивості, якщо ви віддаєте перевагу обчислюванню кутів в градусах.

Для переміщення нашої іконку, нам потрібно поновлювати її положення та оберт кожен кадр у ігровому циклі. Ми можемо використовувати віртуальну функцію _process() класу Node. Якщо ви визначите її в будь-якому класі, який розширює клас Node, як-от Sprite2D, Godot буде викликати цю функцію кожен кадр і передавати їй аргумент під назвою delta, тобто час, що минув від останнього кадру.

Примітка

Ігри працюють, відтворюючи багато зображень за секунду, кожне з яких називається кадром, і роблять це циклічно. Ми вимірюємо швидкість, з якою гра створює зображення в кадрах за секунду (FPS). Більшість ігор націлені на 60 FPS, хоча ви можете знайти і 30 FPS на повільних мобільних пристроях або від 90 до 240 для ігор віртуальної реальності.

Розробники рушія та ігор роблять усе можливе, щоб оновлювати ігровий світ і відтворювати зображення через постійний проміжок часу, але завжди є невеликі зміни в часі візуалізації кадрів. Ось чому рушій надає нам це значення дельта-часу, завдяки чому наш рух не залежить від частоти кадрів.

У нижній частині скрипту визначте функцію:

func _process(delta):
    rotation += angular_speed * delta

Ключове слово func визначає нову функцію. Після нього ми повинні написати ім’я функції та аргументи, які вона приймає, у дужках. Двокрапка закінчує визначення, а наступні блоки з відступом є вмістом або інструкціями функції.

Примітка

Зверніть увагу, що як _process(), так і _init(), починається з підкреслення. За домовленістю, віртуальні функції Godot, тобто вбудовані функції, які ви можете замінити для зв’язку з рушієм, починаються з підкреслення.

Рядок всередині функції, rotation += angular_speed * delta, збільшує оберт нашого спрайта кожен кадр. Тут rotation є властивістю, успадкованою від класу Node2D, який розширює Sprite2D. Він контролює обертання нашого вузла і працює з радіанами.

Порада

У редакторі коду ви можете Ctrl + Click (Cmd + Click у macOS) на будь-якій вбудованій властивості або функції, такій як position, rotation або _process, щоб відкрити відповідну документацію в новій вкладці.

Запустіть сцену, щоб побачити, як значок Godot повертається на місці.

../../_images/scripting_first_script_godot_turning_in_place.gif

Примітка

Зверніть увагу, що в C# аргумент delta , який приймає _Process(), це double. Ми повинні конвертувати його в float, перед тим як застосовувати до обертання.

Рухатися вперед

Давайте тепер змусимо вузол рухатися. Додайте наступні два рядки до функції _process(), переконавшись, що нові рядки мають відступ такий самий, як і попередній рядок rotation += angular_speed * delta.

var velocity = Vector2.UP.rotated(rotation) * speed

position += velocity * delta

Як ми вже бачили, ключове слово var визначає нову змінну. Якщо розмістити його у верхній частині сценарію, він визначає властивість класу. Усередині функції він визначає локальну змінну: вона існує лише в межах функції.

Ми визначаємо локальну змінну з назвою velocity, 2D вектор, що представляє і напрямок, і швидкість. Щоб змусити вузол рухатися вперед, ми починаємо з константи Vector2.UP класу Vector2, вектор спрямовання вгору, і обертаємо його, викликаючи метод rotated() цього Vector2. Цей вираз, Vector2.UP.rotated(rotation), є вектором, спрямування вперед відносно нашої піктограми. Помножений на нашу властивість speed, він дає нам швидкість, яку ми можемо використовувати для переміщення вузла вперед.

Ми додаємо velocity * delta до position вузла, щоб перемістити його. Сама позиція має тип Vector2, вбудований у Godot тип , що представляє 2D вектор.

Запустіть сцену, щоб побачити, як голова Godot рухається по колу.

../../_images/scripting_first_script_rotating_godot.gif

Примітка

Переміщення такого вузла не враховує зіткнення зі стінами або підлогою. У Ваша перша 2D гра ви дізнаєтеся про інший підхід до рухомих об’єктів під час виявлення зіткнень.

Зараз наш вузол рухається сам. У наступній частині Обробка вводу гравця, ми використаємо ввід гравця, щоб контролювати його.

Завершений скрипт

Ось повний файл sprite_2d.gd для порівняння.

extends Sprite2D

var speed = 400
var angular_speed = PI


func _process(delta):
    rotation += angular_speed * delta

    var velocity = Vector2.UP.rotated(rotation) * speed

    position += velocity * delta