Up to date

This page is up to date for Godot 4.2. If you still find outdated information, please open an issue.

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

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

../../_images/scripting_first_script_rotating_godot.gif

Дивись також

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

Дивись також

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

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

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

Нам потрібно створити Sprite2D-вузол, щоб відобразити його у грі. У док-станції Сцена (Scene) натисніть кнопку Інший вузол (Other Node).

../../_images/scripting_first_script_click_other_node.webp

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

../../_images/scripting_first_script_add_sprite_node.webp

На вкладці Сцена тепер має бути лише вузол Sprite2D.

../../_images/scripting_first_script_scene_tree.webp

Вузол Sprite2D потребує текстури для відображення. У інспекторі праворуч ви можете побачити, що властивість Texture має значення "[empty]". Щоб відобразити піктограму Годо, клацніть і перетягніть файл icon.svg з док-станції FileSystem до слоту Texture (Текстура).

../../_images/scripting_first_script_setting_texture.webp

Примітка

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

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

../../_images/scripting_first_script_centering_sprite.webp

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

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

../../_images/scripting_first_script_attach_script.webp

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

Змініть поле Шаблон з "Вузол: Default" на "Object: Порожній", щоб почати з чистого файлу. Залиште інші параметри за замовчуванням і натисніть кнопку Створити, щоб створити скрипт.

../../_images/scripting_first_script_attach_node_script.webp

The Script workspace should appear with your new sprite_2d.gd file open and the following line of code:

extends Sprite2D

Every GDScript file is implicitly a class. The extends keyword defines the class this script inherits or extends. In this case, it's Sprite2D, meaning our script will get access to all the properties and functions of the Sprite2D node, including classes it extends, like Node2D, CanvasItem, and Node.

Примітка

In GDScript, if you omit the line with the extends keyword, your class will implicitly extend RefCounted, which Godot uses to manage your application's memory.

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

Примітка

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

You can hover over any property's name in the Inspector to see a description and its identifier in code.

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

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

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

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

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

Примітка

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

Save the scene as sprite_2d.tscn if you haven't already, then press F6 (Cmd + R on macOS) to run it. Look at the Output bottom panel that expands. It should display "Hello, world!".

../../_images/scripting_first_script_print_hello_world.webp

Delete the _init() function, so you're only left with the line extends Sprite2D.

Обертання

It's time to make our node move and rotate. To do so, we're going to add two member variables to our script: the movement speed in pixels per second and the angular speed in radians per second. Add the following after the extends Sprite2D line.

var speed = 400
var angular_speed = PI

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

Примітка

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

To move our icon, we need to update its position and rotation every frame in the game loop. We can use the _process() virtual function of the Node class. If you define it in any class that extends the Node class, like Sprite2D, Godot will call the function every frame and pass it an argument named delta, the time elapsed since the last frame.

Примітка

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

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

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

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

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

Примітка

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

The line inside the function, rotation += angular_speed * delta, increments our sprite's rotation every frame. Here, rotation is a property inherited from the class Node2D, which Sprite2D extends. It controls the rotation of our node and works with radians.

Порада

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

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

../../_images/scripting_first_script_godot_turning_in_place.gif

Примітка

In C#, notice how the delta argument taken by _Process() is a double. We therefore need to convert it to float when we apply it to the rotation.

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

Let's now make the node move. Add the following two lines inside of the _process() function, ensuring the new lines are indented the same way as the rotation += angular_speed * delta line before them.

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

position += velocity * delta

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

We define a local variable named velocity, a 2D vector representing both a direction and a speed. To make the node move forward, we start from the Vector2 class's constant Vector2.UP, a vector pointing up, and rotate it by calling the Vector2 method rotated(). This expression, Vector2.UP.rotated(rotation), is a vector pointing forward relative to our icon. Multiplied by our speed property, it gives us a velocity we can use to move the node forward.

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

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

../../_images/scripting_first_script_rotating_godot.gif

Примітка

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

Our node currently moves by itself. In the next part, Обробка вводу гравця, we'll use player input to control it.

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

Here is the complete sprite_2d.gd file for reference.

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