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

In this lesson, you will code your first script to make the Godot icon turn in circles using GDScript. As we mentioned in the introduction, we assume you have programming foundations. The equivalent C# code has been included in another tab for convenience.

../../_images/scripting_first_script_rotating_godot.gif

Дивись також

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

Дивись також

To learn more about C#, head to the C# basics page.

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

Будь ласка, створіть новий проект, щоб почати з чистого аркуша. Ваш проект має містити одну картинку: значок 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 нашого вузла.

Примітка

By default, the Inspector displays a node's properties in "Title Case", with capitalized words separated by a space. In GDScript code, these properties are in "snake_case", which is lowercase with words separated by an underscore.

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

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

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

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

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

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

Примітка

GDScript is an indent-based language. The tab at the start of the line that says print() is necessary for the code to work. If you omit it or don't indent a line correctly, the editor will highlight it in red and display the following error message: "Indented block expected".

Save the scene 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.png

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

Обертання

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

var speed = 400
var angular_speed = PI

Member variables sit near the top of the script, after any "extends" lines, but before functions. Every node instance with this script attached to it will have its own copy of the speed and angular_speed properties.

Примітка

Angles in Godot work in radians by default, but you have built-in functions and properties available if you prefer to calculate angles in degrees instead.

Щоб перемістити нашу іконку, нам потрібно оновити її положення та обертати кожен кадр у ігровому циклі. Ми можемо використовувати віртуальну функцію _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