Створення першого сценарію
In this lesson, you will code your first script to make the Godot icon turn in circles. As we mentioned in the introduction, we assume you have programming foundations.
This tutorial is written for GDScript, and the equivalent C# code is included in another tab of each codeblock for convenience.
Дивись також
To learn more about GDScript, its keywords, and its syntax, head to the Скрипт section. To learn more about C#, head to the C#/.NET section.
Налаштування проєкту
Будь ласка create a new project почати з чистого аркуша. Ваш проект має містити одне зображення: значок Godot, який ми часто використовуємо для створення прототипів у спільноті.
We need to create a Sprite2D node to display it in the game. In the Scene dock, click the Other Node button.
Введіть "Sprite2D" у рядку пошуку, щоб відфільтрувати вузли, і двічі клацніть на Sprite2D, щоб створити вузол.
На вкладці Сцена тепер має бути лише вузол Sprite2D.
A Sprite2D node needs a texture to display. In the Inspector on the right, you
can see that the Texture property says <empty>. To display the Godot icon,
click and drag the file icon.svg from the FileSystem dock onto the Texture
slot.
Примітка
Ви можете створювати вузли Sprite2D автоматично, перетягуючи зображення на область перегляду.
Потім клацніть і перетягніть піктограму у вікні перегляду, щоб відцентрувати її в області перегляду гри.
Створення нового сценарію
To create and attach a new script to our node, right-click on Sprite2D in the Scene dock and select Attach Script.
The Attach Node Script window appears. It allows you to select the script's language and file path, among other options.
Change the Template field from Node: Default to Object: Empty to
start with a clean file. Leave the other options set to their default values and
click the Create button to create the script.
Примітка
Назви скриптів C# повинні збігатися з назвою класу. У цьому випадку файл слід назвати MySprite2D.cs.
Робоча область Script має з’явитися з відкритим новим файлом sprite_2d.gd і таким рядком коду:
extends Sprite2D
using Godot;
using System;
public partial class MySprite2D : Sprite2D
{
}
Кожен файл GDScript неявно є класом. Ключове слово extends визначає клас, який успадковує або розширює цей скрипт. У цьому випадку це Sprite2D, що означає, що наш скрипт отримає доступ до всіх властивостей і функцій вузла Sprite2D, включаючи класи, які він розширює, наприклад, Node2D, CanvasItem і Node.
Примітка
У GDScript, якщо ви пропустите рядок із ключовим словом extends, ваш клас неявно розширить клас RefCounted, який Godot використовує для керування пам’яттю вашої програми.
Успадковані властивості включають ті, які ви можете побачити в панелі Інспектор, як-от texture нашого вузла.
Примітка
За замовчуванням Інспектор відображає властивості вузла з великої літери, розділені проміжком ("Title Case"). У коді GDScript ці властивості позначаються у нижньому регістрі та розділені символом підкреслення ("snake_case").
Ви можете навести курсор на назву будь-якої властивості в Інспекторі, щоб побачити опис та її ідентифікатор у коді.
Привіт, всесвіт!
Наш скрипт наразі нічого не робить. Давайте змусимо його надрукувати текст "Привіт, світ!" до нижньої панелі виводу, щоб почати.
Додайте наступний код до свого сценарію:
func _init():
print("Hello, world!")
public MySprite2D()
{
GD.Print("Hello, world!");
}
Давайте розберемо його. Ключове слово func визначає нову функцію під назвою _init. Це спеціальна назва для конструктора нашого класу. Движок викликає _init() для кожного об'єкта або вузла після його створення в пам'яті, якщо ви визначаєте цю функцію.
Примітка
GDScript — це мова на основі відступів. Для того, щоб код працював, необхідна вкладка на початку рядка з текстом print(). Якщо ви пропустите його або неправильно відступите рядок, редактор виділить його червоним і відобразить таке повідомлення про помилку: «Очікується блок із відступом».
Збережіть сцену як sprite_2d.tscn, якщо ви ще цього не зробили, та натисніть F6 (Cmd + R на macOS), щоб запустити її. Погляньте на нижню панель Вивід, яка розгорнеться. На ній має відображатися "Привіт, світ!".
Видаліть функцію _init(), щоб у вас залишився лише рядок extends Sprite2D.
Обертання
Настав час змусити наш вузол рухатися і обертатися. Для цього ми збираємося додати до нашого скрипту дві змінні-члени: швидкість руху в пікселях за секунду і кутову швидкість в радіанах за секунду. Додайте, після рядка extends Sprite2D, наступне.
var speed = 400
var angular_speed = PI
private int _speed = 400;
private float _angularSpeed = Mathf.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
public override void _Process(double delta)
{
Rotation += _angularSpeed * (float)delta;
}
Ключове слово func визначає нову функцію. Після нього ми повинні написати ім’я функції та аргументи, які вона приймає, у дужках. Двокрапка закінчує визначення, а наступні блоки з відступом є вмістом або інструкціями функції.
Примітка
Зверніть увагу, що як _process(), так і _init(), починається з підкреслення. За домовленістю, віртуальні функції Godot, тобто вбудовані функції, які ви можете замінити для зв’язку з рушієм, починаються з підкреслення.
Рядок всередині функції, rotation += angular_speed * delta, збільшує оберт нашого спрайта кожен кадр. Тут rotation є властивістю, успадкованою від класу Node2D, який розширює Sprite2D. Він контролює обертання нашого вузла і працює з радіанами.
Порада
In the code editor, you can Ctrl + Click (Cmd + Click on
macOS) on any built-in property or function like position,
rotation, or _process to open the corresponding documentation
in a new tab.
Запустіть сцену, щоб побачити, як значок Godot повертається на місці.
Примітка
Зверніть увагу, що в C# аргумент delta , який приймає _Process(), це double. Ми повинні конвертувати його в float, перед тим як застосовувати до обертання.
Рухатися вперед
Давайте тепер змусимо вузол рухатися. Додайте наступні два рядки до функції _process(), переконавшись, що нові рядки мають відступ такий самий, як і попередній рядок rotation += angular_speed * delta.
var velocity = Vector2.UP.rotated(rotation) * speed
position += velocity * delta
var velocity = Vector2.Up.Rotated(Rotation) * _speed;
Position += velocity * (float)delta;
Як ми вже бачили, ключове слово var визначає нову змінну. Якщо розмістити його у верхній частині сценарію, він визначає властивість класу. Усередині функції він визначає локальну змінну: вона існує лише в межах функції.
Ми визначаємо локальну змінну з назвою velocity, 2D вектор, що представляє і напрямок, і швидкість. Щоб змусити вузол рухатися вперед, ми починаємо з константи Vector2.UP класу Vector2, вектор спрямовання вгору, і обертаємо його, викликаючи метод rotated() цього Vector2. Цей вираз, Vector2.UP.rotated(rotation), є вектором, спрямування вперед відносно нашої піктограми. Помножений на нашу властивість speed, він дає нам швидкість, яку ми можемо використовувати для переміщення вузла вперед.
Ми додаємо velocity * delta до position вузла, щоб перемістити його. Сама позиція має тип Vector2, вбудований у Godot тип , що представляє 2D вектор.
Запустіть сцену, щоб побачити, як голова Godot рухається по колу.
Примітка
Переміщення такого вузла не враховує зіткнення зі стінами або підлогою. У Ваша перша 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
using Godot;
using System;
public partial class MySprite2D : Sprite2D
{
private int _speed = 400;
private float _angularSpeed = Mathf.Pi;
public override void _Process(double delta)
{
Rotation += _angularSpeed * (float)delta;
var velocity = Vector2.Up.Rotated(Rotation) * _speed;
Position += velocity * (float)delta;
}
}