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

Дивись також
Щоб дізнатися більше про GDScript, його ключові слова та синтаксис, перейдіть до Посилання на GDScript.
Дивись також
Щоб дізнатися більше про C#, перегляньте основи C#.
Налаштування проєкту¶
Будь ласка, створіть новий проект, щоб почати з чистого аркуша. Ваш проект має містити одну картинку: значок Godot, який ми часто використовуємо для створення прототипів у спільноті.
Нам потрібно створити вузол Sprite, щоб відобразити його в грі. На панелі «Сцена» натисніть кнопку «Інший вузол».

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

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

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

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

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

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

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

Робоча область Script має з’явитися з відкритим новим файлом Sprite.gd
і таким рядком коду:
extends Sprite
public class Sprite : Godot.Sprite
// Declare member variables here. Examples:
// private int a = 2;
// private string b = "text";
// Called when the node enters the scene tree for the first time.
public override void _Ready()
{
}
// // Called every frame. 'delta' is the elapsed time since the previous frame.
// public override void _Process(float delta)
// {
//
// }
Кожен файл GDScript є неявно класом. Ключове слово extends
визначає клас, який успадковує або розширює цей сценарій. У цьому випадку це Sprite
, що означає, що наш скрипт отримає доступ до всіх властивостей і функцій вузла Sprite, включаючи класи, які він розширює, наприклад, Node2D
, CanvasItem
і ``Node` ``.
Примітка
У GDScript, якщо ви пропустите рядок із ключовим словом extends
, ваш клас неявно розширить клас Reference, який Godot використовує для керування пам’яттю вашої програми.
Успадковані властивості включають ті, які ви можете побачити в панелі Інспектор, як-от texture
нашого вузла.
Примітка
За замовчуванням Інспектор відображає властивості вузла з великої літери, розділені проміжком ("Title Case"). У коді GDScript ці властивості позначаються у нижньому регістрі та розділені символом підкреслення ("snake_case").
Ви можете навести курсор на назву будь-якої властивості в Інспекторі, щоб побачити опис та її ідентифікатор у коді.
Привіт, всесвіт!¶
Наш скрипт наразі нічого не робить. Давайте змусимо його надрукувати текст "Привіт, світ!" до нижньої панелі виводу, щоб почати.
Додайте наступний код до свого сценарію:
func _init():
print("Hello, world!")
public Sprite()
{
GD.Print("Hello, world!");
}
Давайте розберемо його. Ключове слово func
визначає нову функцію під назвою _init
. Це спеціальна назва для конструктора нашого класу. Движок викликає _init()
для кожного об'єкта або вузла після його створення в пам'яті, якщо ви визначаєте цю функцію.
Примітка
GDScript — мова, базована на відступах. Табуляція на початку рядка ``print()``необхідниа для роботи коду. Якщо ви пропустите її або зробите не правильний відступ, редактор виділить його червоним кольором і відобразить повідомлення про помилку: "Неочікуваний відступ".
Збережіть сцену, якщо ви ще цього не зробили, та натисніть F6 (Cmd + R на macOS), щоб запустити її. Погляньте на нижню панель Вивід, яка розгорнеться. На ній має відображатися "Привіт, світ!".

Видаліть функцію _init()
, щоб у вас залишився лише рядок extends Sprite
.
Обертання¶
Настав час змусити наш вузол рухатися і обертатися. Для цього ми збираємося додати до нашого сценарію дві змінні-члени: швидкість руху в пікселях за секунду і кутову швидкість в радіанах за секунду.
var speed = 400
var angular_speed = PI
private int Speed = 400;
private float AngularSpeed = Mathf.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
public override void _Process(float delta)
{
Rotation += AngularSpeed * delta;
}
Ключове слово func
визначає нову функцію. Після нього ми повинні написати ім’я функції та аргументи, які вона приймає, у дужках. Двокрапка закінчує визначення, а наступні блоки з відступом є вмістом або інструкціями функції.
Примітка
Зверніть увагу, що як _process()
, так і _init()
, починається з підкреслення. За домовленістю, віртуальні функції Godot, тобто вбудовані функції, які ви можете замінити для зв’язку з рушієм, починаються з підкреслення.
Рядок всередині функції, rotation += angular_speed * delta
, збільшує обертання нашого спрайта кожен кадр. Тут rotation
є властивістю, успадкованою від класу Node2D
, який розширює Sprite
. Він контролює обертання нашого вузла і працює з радіанами.
Порада
У редакторі коду ви можете клацнути, утримуючи клавішу ctrl, будь-яку вбудовану властивість або функцію, як-от position
, rotation
або _process
, щоб відкрити відповідну документацію у новій вкладці.
Запустіть сцену, щоб побачити, як значок Godot повертається на місці.

Рухатися вперед¶
Тепер змусимо вузол рухатися. Додайте наступні два рядки до функції _process()
, переконавшись, що нові рядки мають відступ так само, як і попередній.
var velocity = Vector2.UP.rotated(rotation) * speed
position += velocity * delta
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 рухається по колу.

Примітка
Переміщення такого вузла не враховує зіткнення зі стінами або підлогою. У Ваша перша 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
using Godot;
public class Sprite : Godot.Sprite
{
private int Speed = 400;
private float AngularSpeed = Mathf.Pi;
public override void _Process(float delta)
{
Rotation += AngularSpeed * delta;
var velocity = Vector2.Up.Rotated(Rotation) * Speed;
Position += velocity * delta;
}
}