Продолжаем разбираться с движком Urho3D. На этот раз я хочу остановиться на редакторе. Он достаточно прост в использовании, но некоторые моменты определенно требуют пояснений, а официальная документация их не раскрывает. Ну и заодно напишем небольшую игрушку. Приступим.



Редактор тоже игра


Редактор — это скрипт на языке AngelScript, запускаемый лаучнером, которым мы пользовались в прошлый раз. А значит, его код можно изучать наряду с другими примерами и, при желании, легко модифицировать. Запустить редактор можно при помощи пакетного файла Build/bin/Editor.bat.

Навигация подобна управлению в шутере. W и S — перемещение вперед и назад, A и D — влево и вправо, Q и E — вниз и вверх. С зажатым шифтом перемещение быстрее. Можно использовать стрелочки. Зажатая правая кнопка мыши позволяет поворачивать камеру в разные стороны. При зажатой средней кнопке происходит вращение вокруг выделенного объекта. Если крутить колесико, то меняется угол обзора (fov). Полный список клавиш можно посмотреть тут.

Настройки


View->Editor Settings — настройка отображения и управления. Для любителей Blender'а есть возможность выбрать альтернативную раскладку клавиатуры. Опция, на которую следует обратить внимание — New node mode. По умолчанию включен режим Use distance. В этом режиме новые ноды создаются в центре экрана на расстоянии, заданном в графе New node distance. Как по мне, это не очень удобно. Мне гораздо больше нравится второй режим — In center. В этом режиме новые ноды создаются в центре координат и их оттуда можно двигать в нужное положение. Третий режим (Raycast) похож на первый, только используется не фиксированное расстояние, а ищется пересечение со сценой.

View->Editor Preferences — настройка интерфейса. Из интересного здесь — возможность выбрать язык (русский в том числе) и задать прозрачность интерфейса. Minimum opacity — прозрачность при перемещении вида, Maximum opacity — все остальное время. Я обычно устанавливаю оба значения в 1, ибо отвлекает. Примечание: чтобы новые значения применились, после ввода нажимайте Enter.

Все настройки хранятся в файле c:\Users\ИМЯ_ПОЛЬЗОВАТЕЛЯ\AppData\Roaming\urho3d\Editor\Config.xml (в Windows). Чтобы сбросить настройки, этот файл можно удалить.

Консоль


При нажатии F1 открывается консоль. Она может работать в двух режимах, переключение между которыми производится с помощью кнопки левее поля ввода.

В режиме FileSystem консоль работает как обычная командная строка Windows (если у вас Windows конечно). Например, если ввести «notepad.exe», то откроется блокнот.

В режиме Script все введенные команды исполняются интерпретатором AngelScript. Например, команда «log.Write(1+2)» выведет 3. Тут мы приходим к пониманию того, что вывод консоли — это лог. Сам лог в текстовом виде записывается в файл c:\Users\ИМЯ_ПОЛЬЗОВАТЕЛЯ\AppData\Roaming\urho3d\logs\Editor.as.log. Он очень сильно вам поможет при отладке скриптов.

Первые шаги


Возьмите архив Urho3DHabrahabr02Start.zip из репозитория github.com/1vanK/Urho3DHabrahabr02 и распакуйте его в пустую папку (у меня этот путь «d:\MyGames\Urho3DHabrahabr02\Urho3DHabrahabr02\», поэтому я буду использовать его для ясности). Этот архив содержит ресурсы, которые понадобятся нам при создании игры: несколько моделей, материалы к ним и один звуковой файл.

В редакторе нажмите File->Set resource path… и укажите путь «d:\MyGames\Urho3DHabrahabr02\Urho3DHabrahabr02\GameData\». Теперь редактор имеет доступ к трем папкам с ресурсами: собственные папки Data и CoreData, которые находятся рядом с ним, и папка GameData, которую мы указали.

Создаем сцену


В браузере ресурсов (Resource Browser) выделите папку Models и перетащите Ground.mdl на корневую ноду Scene в окне Hierarchy.



При этом автоматически будет создана новая нода с компонентом StaticModel (простая модель без скелета). В окне Attribute inspector задайте для ноды имя Ground, нажмите кнопку Pick возле графы Material и выберите Materials/Ground.xml.



Теперь у нас есть пол, но сцена плохо освещена, поэтому давайте добавим источник света.

Для начала создадим новый узел. Выделите корневую ноду Scene и выберите пункт меню Create->Local node. Можно также создавать Replicated node. В нашем случае нет никакой разницы, так как реплицируемые ноды синхронизируются при сетевом взаимодействии, а с сетью мы работать не планируем. Ноды также можно создавать не через меню, а с помощью вертикальной панели в левой части редактора.

Убедитесь, что новосозданная нода выделена, и выберите пункт меню Create->Component->Scene->Light (многие компоненты продублированы на левой вертикальной панели). В окне Attribute inspector задайте имя для ноды, выберите тип источника Directional (солнечный свет), укажите яркость, поворот, позицию (для данного типа источника света позиция не имеет значения, но поднимем ноду выше, чтобы не мешала работать со сценой). Также включите опцию Cast Shadows, чтобы источник света мог создавать тени.



Теперь изменим фоновое освещение. Выделите корневую ноду Scene и создайте компонент Zone (Create->Component->Scene->Zone). Задайте цвет фона (Fog Color) и цвет фонового освещения (Ambient Color). Эти значения будут использоваться, только если камера находится в пределах зоны, поэтому расширьте границы (Bounding Box Min/Max).



Скрипты


Создайте новую ноду, добавьте к ней компонент AnimatedModel (модель со скелетом) и укажите модель Models/Cannon.mdl и материал Materials/Cannon.xml. Сдвиньте пушку немного вверх, а также включите опцию Cast Shadows, чтобы пушка отбрасывала тень.



Дочерние ноды, которые вы видите у пушки — это встроенные в модель кости. Пока что не обращайте на них внимания.

В папке GameData\Scripts создайте файл Cannon.as со следующим содержимым:

class Cannon : ScriptObject
{
    // Положительное или отрицательное направление вращения пушки.
    int direction = 1;

    // Функция вызывается каждый кадр.
    void Update(float timeStep)
    {
        // Угол поворота вокруг оси x (node указывает на ноду, к которой прикреплен скрипт).
        float pitch = node.rotation.pitch;
        
        // Меняем направление вращения, если значение угла выходит за заданные пределы.
        if (pitch >= 70.0f)
            direction = -1;
        else if (pitch <= -10.0f)
            direction = 1;
        
        pitch += 30.0f * direction * timeStep;
        node.rotation = Quaternion(pitch, 0.0f, 0.0f);
    }
}

Скрипты лучше сохранять в кодировке UTF-8, тогда не будет проблем с кириллицей.

К ноде Cannon добавьте компонент ScriptInstance (Create->Component->Logic->ScriptInstance). Нажмите на кнопку Pick и выберите новосозданный файл, а в графе Class Name введите Cannon (файл может содержать несколько классов). После ввода не забудьте нажать Enter. Если все сделано правильно, ниже имени класса должна появиться переменная direction, которую мы объявили в скрипте.

Убедитесь, что переключатель RevertOnPause (третья кнопка на верхней панели) активирован и нажмите кнопку RunUpdatePlay (первая кнопка на верхней панели). Пушка начнет вращаться туда-сюда. Для остановки нажмите RunUpdatePause (средняя кнопка).



Что делает переключатель RevertOnPause? Если он активен, то перед запуском состояние сцены запоминается, а при нажатии на паузу состояние восстанавливается до исходного. Эта кнопка нам еще пригодится во второй части урока.

А пока сохраните сцену (File->Save scene as...) в файл GameData/Scenes/Level01.xml.

Продолжение следует...

Комментарии (0)