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

У цьому уроці ви напишете свій перший сценарій на GDScript, що буде обертати піктограму Godot по колу. Як ми вже згадували у вступі, ми припускаємо, що ви володієте основами програмування. Для зручності еквівалентний C# код знахолиться в іншій вкладці.

../../_images/scripting_first_script_rotating_godot.gif

Дивись також

Щоб дізнатися більше про GDScript, його ключові слова та синтаксис, перейдіть до Посилання на GDScript.

Дивись також

Щоб дізнатися більше про C#, перегляньте основи C#.

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

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

Нам потрібно створити вузол Sprite, щоб відобразити його в грі. На панелі «Сцена» натисніть кнопку «Інший вузол».

../../_images/scripting_first_script_click_other_node.png

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

../../_images/scripting_first_script_add_sprite_node.png

Ваша вкладка «Сцена» тепер має лише вузол Sprite.

../../_images/scripting_first_script_scene_tree.png

Для відображення вузла Sprite потрібна текстура. У Інспекторі праворуч ви можете побачити, що властивість Texture говорить «[порожньо]». Щоб відобразити піктограму Godot, клацніть і перетягніть файл icon.png із вкладки Файлова система у слот Texture.

../../_images/scripting_first_script_setting_texture.png

Примітка

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

../../_images/scripting_first_script_dragging_sprite.png

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

../../_images/scripting_first_script_centering_sprite.png

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

Щоб створити та приєднати новий сценарій до нашого вузла, клацніть правою кнопкою миші на Sprite в панелі сцени та виберіть «Долучити скрипт».

../../_images/scripting_first_script_attach_script.png

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

Змініть шаблон із Типовий на Empty, щоб почати з чистого файлу. Залиште інші параметри за замовчуванням і натисніть кнопку Створити, щоб створити сценарій.

../../_images/scripting_first_script_attach_node_script.png

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

extends Sprite

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

Примітка

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

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

Примітка

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

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

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

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

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

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

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

Примітка

GDScript — мова, базована на відступах. Табуляція на початку рядка ``print()``необхідниа для роботи коду. Якщо ви пропустите її або зробите не правильний відступ, редактор виділить його червоним кольором і відобразить повідомлення про помилку: "Неочікуваний відступ".

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

../../_images/scripting_first_script_print_hello_world.png

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

Обертання

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

var speed = 400
var angular_speed = PI

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

Примітка

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

Щоб перемістити нашу іконку, нам потрібно оновити її положення та обертати кожен кадр у ігровому циклі. Ми можемо використовувати віртуальну функцію _process() класу Node. Якщо ви визначите її в будь-якому класі, який розширює клас Node, як-от Sprite, 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, який розширює Sprite. Він контролює обертання нашого вузла і працює з радіанами.

Порада

У редакторі коду ви можете клацнути, утримуючи клавішу ctrl, будь-яку вбудовану властивість або функцію, як-от position, rotation або _process, щоб відкрити відповідну документацію у новій вкладці.

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

../../_images/scripting_first_script_godot_turning_in_place.gif

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

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

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

position += velocity * delta

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

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

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

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

../../_images/scripting_first_script_rotating_godot.gif

Примітка

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

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

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

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

extends Sprite

var speed = 400
var angular_speed = PI


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

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

    position += velocity * delta