Эта статья является результатом английского перевода Google Translate, и DrGraph добавил некоторые исправления на этой основе. Оригинальная страница на английском языке:
Создание вашего первого скрипта — документация Godot Engine (stable) на английском языке
Создайте свой первый скрипт¶
На этом уроке вы напишете свой первый скрипт для вращения значка Godot с помощью GDScript. Как мы упоминали во введении , мы предполагаем, что у вас есть опыт программирования. Для удобства эквивалентный код C# включен в другую вкладку.
Справка: Чтобы узнать больше о GDScript, его ключевых словах и синтаксисе, перейдите к Справочнику по GDScript .
Справка: Чтобы узнать больше о C#, посетите страницу C# Fundamentals .
Настройки проекта¶
Пожалуйста, создайте новый проект , чтобы начать с нуля. Ваш проект должен включать изображение: иконку Godot, которую мы часто используем в сообществе для прототипирования.
Нам нужно создать узел Sprite2D, чтобы отобразить его в игре. В доке сцены нажмите кнопку «Другие узлы».
Введите «Sprite2D» в строке поиска, чтобы отфильтровать узлы, затем дважды щелкните Sprite2D, чтобы создать узел.
Теперь на вкладке вашей сцены должен быть только один узел Sprite2D.
Узел Sprite2D нуждается в текстуре [Texture] для отображения. В Инспекторе справа вы можете видеть, что свойство Текстуры читается как «[пусто]». Чтобы отобразить значок Godot, щелкните и перетащите файл icon.svg
из дока файловой системы в слот текстуры.
Примечание. Вы можете автоматически создавать узлы Sprite2D, перетаскивая изображения в область просмотра.
Затем щелкните и перетащите значок в окне просмотра, чтобы отцентрировать его в игровом представлении.
Создайте новый скрипт¶
Чтобы создать новый сценарий и прикрепить его к нашему узлу, щелкните правой кнопкой мыши Sprite2D в доке сцены и выберите «Прикрепить сценарий».
Появится окно Присоединить сценарий узла. Это позволяет вам выбрать язык сценария и путь к файлу среди других параметров.
Измените поле шаблона с «узел: по умолчанию» на «объект: пустой», чтобы начать с чистого файла. Оставьте остальные параметры по умолчанию и нажмите кнопку «Создать», чтобы создать скрипт.
Рабочая область скрипта должна появиться с sprite_2d.gd
новым открытым файлом и следующей строкой кода:
GD-скрипт |
расширяет Sprite2D |
С# |
с помощью Годо; общедоступный частичный класс MySprite2D: Sprite2D |
Каждый файл GDScript неявно является классом. ключевое слово extends
определяет классы, от которых этот скрипт наследует или расширяет. В данном случае это Sprite2D
, что означает, что наш скрипт будет иметь доступ ко всем свойствам и функциям узла Sprite2D, включая классы, которые он расширяет, такие как Node2D
, CanvasItem
и Node
.
Примечание. В GDScript, если вы опустите строку с ключевым словом extends
, ваш класс будет неявно расширять RefCounted , который Godot использует для управления памятью приложения.
К унаследованным свойствам относятся те, которые вы видите в доке Inspector, например, наш узел texture
.
Примечание. По умолчанию Инспектор отображает свойства узла в «Заглавном регистре», где слова в верхнем регистре разделяются пробелами. В коде GDScript эти свойства находятся в «snake_case», то есть строчных буквах с символами подчеркивания, разделяющими слова.
Вы можете навести указатель мыши на любое имя свойства в инспекторе, чтобы увидеть описание и его идентификатор в коде.
Привет, мир! ¶
Наш скрипт в настоящее время ничего не делает. Давайте для начала напечатаем текст «Hello, world!» на нижней панели вывода.
Добавьте следующий код в ваш скрипт:
GD-скрипт |
func _init(): |
С# |
публичный MySprite2D() { GD.Print("Привет, мир!"); } |
Давайте сломаем это. ключевое слово func
определяет новую функцию с именем _init
. Это специальное имя для конструктора нашего класса. Если вы определите эту функцию, движок будет _init()
вызывать ее при создании каждого объекта или узла в памяти.
Примечание. GDScript — это язык, основанный на отступах. Табуляция в начале строки указывает на то, что print()
она необходима для работы кода. Если вы опустите его или сделаете неправильный отступ строки, редактор выделит ее красным цветом и отобразит следующее сообщение об ошибке: «Ожидается блок с отступом».
如果您还没有保存场景,可以将场景保存为sprite_2d.tscn
, затем нажмите F6 (Cmd + R в macOS), чтобы запустить его. Просмотрите расширенную нижнюю панель вывода . Он должен отображать «Привет, мир!».
После удаления _init()
функции у вас останется только одна строка кода.extends Sprite2D
Повернуть¶ _
Время перемещать и вращать наши узлы. Для этого мы добавим в скрипт две переменные-члены: скорость движения [speed] в пикселях/секунду и угловую скорость [angular_speed] в радианах/секунду. extends Sprite2D
Добавьте следующий контент после [GDScript] .
GDScript |
var speed = 400 var angular_speed = PI |
С# |
частный интервал _speed = 400; частный поплавок _angularSpeed = Mathf.Pi; |
Переменные-члены расположены в верхней части скрипта после любых строк «расширения», но перед функциями. Каждый экземпляр узла с прикрепленным этим сценарием будет иметь собственную копию свойств speed
и angular_speed
.
Примечание. Углы в Godot по умолчанию измеряются в радианах, но если вы предпочитаете рассчитывать углы в градусах, доступны встроенные функции и свойства.
Чтобы переместить нашу иконку, нам нужно обновлять ее положение и поворот [состояние] каждый кадр в игровом цикле. Мы можем использовать Node
виртуальные функции класса _process()
. Если вы определите ее в любом классе, производном от Node, таком как Sprite2D, Godot будет вызывать функцию в каждом кадре и передавать ей параметр delta
с именем , который представляет собой время, прошедшее с момента предыдущего кадра.
ПРИМЕЧАНИЕ. Игры работают, отображая множество изображений в секунду, каждое изображение называется кадром, и они делают это в цикле. Мы измеряем скорость, с которой игра генерирует графику, в кадрах в секунду (FPS). Стремитесь к 60 кадрам в секунду для большинства игр, хотя вы можете найти 30 кадров в секунду на более медленных мобильных устройствах или от 90 до 240 кадров в секунду в играх виртуальной реальности.
Разработчики движка и игр делают все возможное, чтобы обновлять игровой мир и отображать графику с постоянными интервалами, но всегда есть небольшие различия во времени рендеринга кадров. Вот почему движок дает нам это значение дельта-времени, чтобы наше движение не зависело от частоты кадров.
В нижней части скрипта определите функцию:
GDScript |
func _process (дельта): вращение += угловая_скорость * дельта |
С# |
public override void _Process (двойная дельта) { Rotation += _angularSpeed * (float) delta; } |
Ключевое слово func
определяет новую функцию [GDScript]. После него в скобках нужно написать имя и параметры функции. Двоеточие завершает определение, а следующий блок с отступом представляет собой содержимое или инструкции функции.
Примечание. Обратите внимание , что _process()
[similar to] _init()
начинается с символа подчеркивания. По соглашению виртуальные функции Godot, то есть встроенные функции, которые вы можете переопределить для связи с движком, начинаются с подчеркивания.
Строка кода в rotation += angular_speed * delta
rotation
Node2D
Sprite2D,
функции должна увеличивать вращение спрайта [Sprite] каждый кадр. Здесь [rotation] является атрибутом, унаследованным от класса [Node2D], а [класс Sprite2D] расширен. Он управляет вращением нашего узла и использует радианы.
Примечание. В редакторе кода можно щелкнуть любое встроенное свойство или функцию, удерживая нажатой клавишу Ctrl, например position
, rotation
, или _process
открыть соответствующий документ в новой вкладке.
Запустите сцену, чтобы увидеть, как значок Годо вращается на месте.
Примечание: в C# будьте осторожны с _Process()
параметром delta为double类型
, поэтому, когда мы применяем его к вращению, нам нужно преобразовать его вfloat。
Переместить¶ _
Теперь позвольте узлам двигаться. Добавьте следующие две строки внутрь функции _process()
, убедившись, что новые строки имеют такой же отступ, как и строки перед ними.rotation += angular * delta
GDScript |
переменная скорость = Vector2.UP.rotated(вращение) * скорость положение += скорость * дельта |
С# |
скорость var = Vector2.Up.Rotated(Rotation) * _speed; Позиция += скорость * (плавающая) дельта; |
Как мы уже видели, var
ключевое слово определяет новую переменную. Если вы поместите его вверху вашего скрипта, он определяет свойство класса. [Используется здесь] Внутри функции он определяет локальную переменную: она существует только в пределах области действия функции.
Мы определяем velocity
локальную переменную с именем , которая представляет собой двумерный вектор [Vector2], представляющий направление и скорость. Чтобы переместить узел вперед, мы Vector2.UP
начинаем с константы класса Vector2, восходящего вектора, и rotated()
вращаем его, вызывая для него метод. Это выражение Vector2.UP.rotated(rotation)【为】
представляет собой вектор, указывающий вперед относительно нашего значка. Умноженное на наше speed
свойство, оно дает нам скорость, которую мы можем использовать для перемещения узла вперед.
Мы добавляем [ velocity * delta
position】
к свойству позиции узла], чтобы переместить его. Сама позиция [позиция] представляет собой тип Vector2 , встроенный в Godot тип, представляющий двумерный вектор.
Запустите сцену, чтобы увидеть, как Годо ходит по кругу [эффект бега].
ПРИМЕЧАНИЕ. Подобные движущиеся узлы не будут учитывать столкновения со стенами или полами. В своей первой 2D-игре вы узнаете еще один способ перемещения объектов при обнаружении столкновений.
Наши узлы в настоящее время перемещаются самостоятельно. В следующем разделе «Прослушивание ввода игрока » мы будем использовать ввод игрока для управления им.
Полный скрипт¶
Вот полный sprite_2d.gd
файл для справки.
GDScript |
расширяет Sprite2D var speed = 400
переменная скорость = Vector2.UP.rotated(вращение) * скорость положение += скорость * дельта |
С# |
с помощью Годо; открытый частичный класс MySprite2D: Sprite2D public override void _Process (двойная дельта) Позиция += скорость * (плавающая) дельта; |