Unreal engine папка что это

Туториал по Unreal Engine. Часть 1: знакомство с движком

Unreal engine папка что это. a987d76b6bf401a0c1cccbeec6db4334. Unreal engine папка что это фото. Unreal engine папка что это-a987d76b6bf401a0c1cccbeec6db4334. картинка Unreal engine папка что это. картинка a987d76b6bf401a0c1cccbeec6db4334

Unreal Engine 4 — это набор инструментов для разработки игр, имеющий широкие возможности: от создания двухмерных игр на мобильные до AAA-проектов для консолей. Этот движок использовался при разработке таких игр, как ARK: Survival Evolved, Tekken 7 и Kingdom Hearts III.

Разработка в Unreal Engine 4 очень проста для начинающих. С помощью системы визуального создания скриптов Blueprints Visual Scripting можно создавать готовые игры, не написав ни строчки кода! В сочетании с удобным интерфейсом это позволяет быстро изготавливать рабочие прототипы.

В этой части туториала по Unreal Engine 4 мы ознакомимся с основными возможностями программы. Вот основные темы, которые будут в нём рассмотрены:

Примечание: туториал будет состоять из восьми частей:

Установка Unreal Engine 4

Для установки Unreal Engine 4 используется Epic Games Launcher. Перейдите на сайт Unreal Engine и нажмите на кнопку Get Unreal в правом верхнем углу.

Unreal engine папка что это. image loader. Unreal engine папка что это фото. Unreal engine папка что это-image loader. картинка Unreal engine папка что это. картинка image loader

Перед загрузкой программы запуска необходимо будет создать учётную запись. После её создания скачайте программу запуска, соответствующую вашей операционной системе.

Unreal engine папка что это. image loader. Unreal engine папка что это фото. Unreal engine папка что это-image loader. картинка Unreal engine папка что это. картинка image loader

После скачивания и установки программы запуска откройте её. Появится следующее окно:

Unreal engine папка что это. image loader. Unreal engine папка что это фото. Unreal engine папка что это-image loader. картинка Unreal engine папка что это. картинка image loader

Введите адрес электронной почты и пароль, использованный для скачивания программы загрузки и нажмите на Sign In. После выполнения входа откроется такое окно:

Unreal engine папка что это. 5d427f82b3c924087a8d82f12913617e. Unreal engine папка что это фото. Unreal engine папка что это-5d427f82b3c924087a8d82f12913617e. картинка Unreal engine папка что это. картинка 5d427f82b3c924087a8d82f12913617e

Нажмите на Install Engine в левом верхнем углу. Программа запуска перейдёт к экрану, на котором можно будет выбрать устанавливаемые компоненты.

Unreal engine папка что это. image loader. Unreal engine папка что это фото. Unreal engine папка что это-image loader. картинка Unreal engine папка что это. картинка image loader

Примечание: Epic Games постоянно обновляет Unreal Engine, поэтому ваша версия движка может слегка отличаться от представленной на скриншотах. Например, после написания первого черновика этого туториала версия уже обновилась до 4.14.3! Туториал подойдёт вам, если у вас есть версия не ниже 4.14.

По умолчанию выбраны Starter Content, Templates and Feature Packs и Engine Source. Лучше так всё и оставить. Они будут полезны по следующим причинам:

Unreal engine папка что это. image loader. Unreal engine папка что это фото. Unreal engine папка что это-image loader. картинка Unreal engine папка что это. картинка image loader

Выбрав нужные компоненты, нажмите на Install. После завершения установки движок появится в библиотеке. Теперь настало время создать проект.

Unreal engine папка что это. image loader. Unreal engine папка что это фото. Unreal engine папка что это-image loader. картинка Unreal engine папка что это. картинка image loader

Создание проекта

Нажмите на одну из кнопок Launch, чтобы открыть браузер проектов (Project Browser). После его открытия нажмите на вкладку New Project.

Unreal engine папка что это. image loader. Unreal engine папка что это фото. Unreal engine папка что это-image loader. картинка Unreal engine папка что это. картинка image loader

Нажмите на вкладку Blueprint. Здесь можно выбрать один из шаблонов. Однако, поскольку мы начинаем с нуля, то выберем шаблон Blank.

Ниже будут перечисленные дополнительные параметры.

Unreal engine папка что это. image loader. Unreal engine папка что это фото. Unreal engine папка что это-image loader. картинка Unreal engine папка что это. картинка image loader

Вот, за что отвечает каждая опция:

Unreal engine папка что это. image loader. Unreal engine папка что это фото. Unreal engine папка что это-image loader. картинка Unreal engine папка что это. картинка image loader

Сменить папку хранения проекта можно, нажав на многоточие в конце поля Folder.

Имя проекта не является названием игры, так что не волнуйтесь, если хотите название позже. Выберите текст в поле Name и введите BananaTurntable.

И наконец нажмите на Create Project.

Навигация по интерфейсу

После создания проекта откроется редактор. Он разделён на несколько панелей:

Unreal engine папка что это. 8e5beae7603538a407cc3d80627203b4. Unreal engine папка что это фото. Unreal engine папка что это-8e5beae7603538a407cc3d80627203b4. картинка Unreal engine папка что это. картинка 8e5beae7603538a407cc3d80627203b4

Импорт ассетов

Какой смысл в поворотном столе, если на нём нечего показывать? Скачайте эту модель банана. Внутри находятся два файла: Banana_Model.fbx и Banana_Texture.jpg. Можете также использовать собственную модель, но зачем, если есть такой потрясающий банан?

Чтобы Unreal мог использовать файлы, их нужно импортировать. Перейдите в Content Browser и нажмите на Import.

Unreal engine папка что это. image loader. Unreal engine папка что это фото. Unreal engine папка что это-image loader. картинка Unreal engine папка что это. картинка image loader

С помощью диспетчера файлов найдите папку, в которой находятся Banana_Model.fbx и Banana_Texture.jpg are. Выделите оба файла и нажмите Open.

Unreal engine папка что это. image loader. Unreal engine папка что это фото. Unreal engine папка что это-image loader. картинка Unreal engine папка что это. картинка image loader

Unreal engine папка что это. image loader. Unreal engine папка что это фото. Unreal engine папка что это-image loader. картинка Unreal engine папка что это. картинка image loader

Нажмите на Import. Два файла появятся в Content Browser.

Unreal engine папка что это. image loader. Unreal engine папка что это фото. Unreal engine папка что это-image loader. картинка Unreal engine папка что это. картинка image loader

При импорте файла на самом деле он не сохраняется в проект, если не указать этого явным образом. Сохранять файлы можно, нажав на файл правой клавишей мыши и выбрав Save. Также можно сохранить все файлы за раз, выбрав File\Save All. Старайтесь сохраняться почаще!

Учтите, что в Unreal модели называются «мешами» (meshes). Теперь у нас есть меш банана, настало время добавить его на уровень.

Добавление мешей на уровень

Пока уровень выглядит довольно пустым, давайте сделаем его интереснее.

Чтобы добавить на уровень меш, нажмите правой клавишу мыши и перетащите Banana_Model из Content Browser во Viewport. Отпустите левую клавишу мыши и меш добавится на уровень.

Unreal engine папка что это. image loader. Unreal engine папка что это фото. Unreal engine папка что это-image loader. картинка Unreal engine папка что это. картинка image loader

Объекты на уровне можно перемещать, поворачивать и масштабировать. Горячие клавиши для этих действий — W, E и R. После нажатия на них можно использовать манипулятор:

Unreal engine папка что это. image loader. Unreal engine папка что это фото. Unreal engine папка что это-image loader. картинка Unreal engine папка что это. картинка image loader

О материалах

Если внимательно посмотреть на банан, то можно увидеть, что он не жёлтый! На самом деле. он выглядит почти полностью серым.

Чтобы придать банану цвет и детали, необходимо создать материал.

Что такое «материал»?

Материал задаёт внешний вид поверхности. На базовом уровне материал определяет четыре аспекта:

Unreal engine папка что это. cc1d4010925091ebb0dfa72846e9397d. Unreal engine папка что это фото. Unreal engine папка что это-cc1d4010925091ebb0dfa72846e9397d. картинка Unreal engine папка что это. картинка cc1d4010925091ebb0dfa72846e9397d

Создание материала

Для создания материала нужно перейти в Content Browser и нажать на зелёную кнопку Add New. Появится меню со списком ассетов, которые можно создать. Выберите Material.

Unreal engine папка что это. image loader. Unreal engine папка что это фото. Unreal engine папка что это-image loader. картинка Unreal engine папка что это. картинка image loader

Назовите материал Banana_Material, а затем дважды нажмите левой клавишей мыши на файле, чтобы открыть его в редакторе материалов.

Unreal engine папка что это. image loader. Unreal engine папка что это фото. Unreal engine папка что это-image loader. картинка Unreal engine папка что это. картинка image loader

Редактор материалов (Material Editor)

Редактор материалов состоит из пяти основных панелей:

Unreal engine папка что это. image loader. Unreal engine папка что это фото. Unreal engine папка что это-image loader. картинка Unreal engine папка что это. картинка image loader

Что такое нод (узел)?

Прежде чем приступать к созданию своего материала, нужно узнать про объекты, которые используются для его создания: ноды.

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

У нодов есть входы и выходы, представленные кругом со стрелкой. Входы расположены слева, а выходы — справа.

Вот пример с использованием нодов Multiply и Constant3Vector, добавляющих текстуре жёлтого цвета:

Unreal engine папка что это. image loader. Unreal engine папка что это фото. Unreal engine папка что это-image loader. картинка Unreal engine папка что это. картинка image loader

У материалов есть особый нод, называемый нодом Result, который в нашем случае уже создан как Banana_Material. Здесь заканчиваются со временем все ноды. То, что подключено к этому ноду, определяет внешний вид конечного материала.

Unreal engine папка что это. image loader. Unreal engine папка что это фото. Unreal engine папка что это-image loader. картинка Unreal engine папка что это. картинка image loader

Добавление текстур

Для добавления модели цвета и деталей нам необходима текстура. Текстура — это просто двухмерное изображение. Обычно они проецируются на трёхмерные модели, придавая им цвет и детали.

Для текстурирования банана мы используем Banana_Texture.jpg. Применить в материале текстуру позволяет нод TextureSample.

Перейдите к панели Palette и найдите TextureSample. Добавьте нод, удерживая левую клавишу мыши и перетащив его на схему.

Unreal engine папка что это. image loader. Unreal engine папка что это фото. Unreal engine папка что это-image loader. картинка Unreal engine папка что это. картинка image loader

Для выбора текстуры необходимо сначала выделить нод TextureSample. Перейдите в панель Details и нажмите на раскрывающийся список, расположенный справа от Texture.

Unreal engine папка что это. image loader. Unreal engine папка что это фото. Unreal engine папка что это-image loader. картинка Unreal engine папка что это. картинка image loader

Откроется меню, в котором перечислены все текстуры проекта. Выберите Banana_Texture.

Unreal engine папка что это. image loader. Unreal engine папка что это фото. Unreal engine папка что это-image loader. картинка Unreal engine папка что это. картинка image loader

Чтобы увидеть текстуру на меше предварительного просмотра, нужно подключить её к ноду Result. Удерживайте левую клавишу мыши на белом контакте выхода нода TextureSample. Перетащите его на входной контакт Base Color нода Result.

Unreal engine папка что это. image loader. Unreal engine папка что это фото. Unreal engine папка что это-image loader. картинка Unreal engine папка что это. картинка image loader

Вернитесь во Viewport, чтобы увидеть текстуру на меше предварительного просмотра. Можно поворачивать его (удерживая левую клавишу мыши и перемещая мышь), чтобы рассмотреть другие детали.

Unreal engine папка что это. 2d9e03aa6a45f0016f89ed25718397a0. Unreal engine папка что это фото. Unreal engine папка что это-2d9e03aa6a45f0016f89ed25718397a0. картинка Unreal engine папка что это. картинка 2d9e03aa6a45f0016f89ed25718397a0

Нажмите на Apply в Toolbar, чтобы обновить материал, и закройте редактор материалов после завершения.

Использование материалов

Чтобы применить материал на банан, нужно его назначить. Вернитесь к Content Browser и дважды нажмите на Banana_Model, чтобы открыть его. Появится следующее окно редактора:

Unreal engine папка что это. 88b394ee3fdc6b37fcc657f164e5bb96. Unreal engine папка что это фото. Unreal engine папка что это-88b394ee3fdc6b37fcc657f164e5bb96. картинка Unreal engine папка что это. картинка 88b394ee3fdc6b37fcc657f164e5bb96

Перейдите в панель Details и найдите раздел Materials. Нажмите на раскрывающееся меню, расположенное справа от Element 0, и выберите Banana_Material.

Unreal engine папка что это. image loader. Unreal engine папка что это фото. Unreal engine папка что это-image loader. картинка Unreal engine папка что это. картинка image loader

Закройте редактор мешей, вернитесь к основному редактору и посмотрите на Viewport. Вы увидите, что теперь на банане есть текстура. Поздравляю, вы теперь знаете всё необходимео, чтобы стать дизайнером уровней!

Unreal engine папка что это. a8a2d7c7f08f751f623b04f26efd77e5. Unreal engine папка что это фото. Unreal engine папка что это-a8a2d7c7f08f751f623b04f26efd77e5. картинка Unreal engine папка что это. картинка a8a2d7c7f08f751f623b04f26efd77e5

Примечание: если освещение слишком тёмное, можно изменить его, зайдя в World Outliner и нажав на Light Source. В панели Details найдите параметр Intensity и увеличьте его значение.

Про Blueprints

Даже несмотря на то, что банан выглядит отлично, будет ещё лучше, если он начнёт вращаться на поворотном столе. Проще всего создать его с помощью «чертежей» Blueprints.

В простейшем случае Blueprint представляет собой «вещь». Blueprints позволяют создавать свои поведения для объектов. Объект может быть чем-то физическим (типа поворотного стола) или чем-то абстрактным, например, системой здоровья.

Хотите создать движущийся автомобиль? Используйте Blueprint. А как насчёт летающей свинки? Используйте Blueprints. А если нужен взрывающийся при касании котик? Blueprints.

Как и в материалах, в Blueprints используется система на основе нодов. Это значит, что достаточно создать ноды и соединить их — никакого кода не требуется!

Примечание: если вы предпочитаете писать код, то используйте вместо этого C++.

Blueprints просты в использовании, однако не так быстры, как код на C++. То есть если вам нужно создать что-то «тяжёлое» с точки зрения вычислений, например, сложный алгоритм, то лучше воспользоваться C++.

Но даже если вы предпочитаете C++, то бывают случаи, когда оптимальнее использовать Blueprints. Вот некоторые из преимуществ Blueprints:

Создание Blueprint

Перейдите в Content Browser и нажмите на Add New. Выберите в списке Blueprint Class.

Unreal engine папка что это. image loader. Unreal engine папка что это фото. Unreal engine папка что это-image loader. картинка Unreal engine папка что это. картинка image loader

Откроется окно с запросом выбора родительского класса. Ваш Blueprint будет наследовать все переменные, функции и компоненты из выбранного родительского класса. Уделите время на изучение возможностей каждого класса.

Unreal engine папка что это. image loader. Unreal engine папка что это фото. Unreal engine папка что это-image loader. картинка Unreal engine папка что это. картинка image loader

Примечание: поскольку мы можем расположить классы Pawn и Character, они также являются акторами (Actors).

Поворотный стол будет находиться на месте, поэтому самым подходящим будет класс Actor. Выберите Actor и назовите новый файл Banana_Blueprint.

Unreal engine папка что это. image loader. Unreal engine папка что это фото. Unreal engine папка что это-image loader. картинка Unreal engine папка что это. картинка image loader

Дважды нажмите на Banana_Blueprint, чтобы открыть его. Нажмите на Open Full Blueprint Editor, если появится подобное окно:

Unreal engine папка что это. image loader. Unreal engine папка что это фото. Unreal engine папка что это-image loader. картинка Unreal engine папка что это. картинка image loader

Blueprint Editor

Во-первых, выберите в редакторе Blueprint editor вкладку Event Graph.

Blueprint editor состоит из четырёх основных панелей:

Unreal engine папка что это. image loader. Unreal engine папка что это фото. Unreal engine папка что это-image loader. картинка Unreal engine папка что это. картинка image loader

Создание поворотного стола

Для создания стола нам нужно две вещи — основание и подставка. Их можно создать с помощью компонентов.

Что такое «компоненты»?

Если Blueprint — это автомобиль, то компоненты — это строительные элементы, из которых он состоит. Примерами компонентов могут быть двери, колёса и двигатель.

Однако компоненты могут быть не только физическими объектами.

Например, чтобы автомобиль мог двигаться, можно добавить компонент движения. Можно даже заставить машину летать, если добавить компонент полёта.

Добавление компонентов

Чтобы увидеть компоненты, необходимо переключиться в режим Viewport. Нажмите на вкладку Viewport, чтобы переключиться на неё. Вот как это выглядит:

Unreal engine папка что это. 39f49d77cf09fbb0b6928e7c99a1ee54. Unreal engine папка что это фото. Unreal engine папка что это-39f49d77cf09fbb0b6928e7c99a1ee54. картинка Unreal engine папка что это. картинка 39f49d77cf09fbb0b6928e7c99a1ee54

Примечание: компонент DefaultSceneRoot при запуске приложения не отображается, он виден только в редакторе.

Поворотный стол будет использовать два компонента:

Unreal engine папка что это. image loader. Unreal engine папка что это фото. Unreal engine папка что это-image loader. картинка Unreal engine папка что это. картинка image loader

Неплохо было бы сделать основание чуть короче. Активируйте манипулятор масштаба, нажав R, а затем уменьшите масштаб (точный размер неважен, можно будет изменить его позже).

Unreal engine папка что это. image loader. Unreal engine папка что это фото. Unreal engine папка что это-image loader. картинка Unreal engine папка что это. картинка image loader

Теперь пора добавить меш. Вернитесь в панель компонентов Components и нажмите левой клавишей на пустой области, чтобы снять выделение с компонента Cylinder. Благодаря этому следующий добавляемый компонент не будет прикреплён к компонентуCylinder.

Unreal engine папка что это. image loader. Unreal engine папка что это фото. Unreal engine папка что это-image loader. картинка Unreal engine папка что это. картинка image loader

Примечание: если этого не сделать, то следующий компонент будет прикреплён к компоненту Cylinder. Это значит, что он также унаследует масштаб компонента Cylinder. Поскольку мы уменьшили масштаб цилиндра, следующий компонент тоже будет уменьшен.

Unreal engine папка что это. d1490501d3a8740e8b5122fd18716ca1. Unreal engine папка что это фото. Unreal engine папка что это-d1490501d3a8740e8b5122fd18716ca1. картинка Unreal engine папка что это. картинка d1490501d3a8740e8b5122fd18716ca1

Затем нажмите на Add Component и выберите из списка Static Mesh.

Unreal engine папка что это. image loader. Unreal engine папка что это фото. Unreal engine папка что это-image loader. картинка Unreal engine папка что это. картинка image loader

Для отображения банана выберите компонент Static Mesh, а затем нажмите на вкладку Details. Нажмите на раскрывающий списков в правой части Static Mesh и выберите Banana_Model.

Unreal engine папка что это. image loader. Unreal engine папка что это фото. Unreal engine папка что это-image loader. картинка Unreal engine папка что это. картинка image loader

Переместите банан, если он находится в неправильном положении. Для этого активируйте манипулятор перемещения, нажав W, а затем переместите его вверх.

Unreal engine папка что это. image loader. Unreal engine папка что это фото. Unreal engine папка что это-image loader. картинка Unreal engine папка что это. картинка image loader

Про ноды Blueprint

Теперь нужно сделать так, чтобы поворотный стол вращался. И здесь нам потребуются ноды Blueprint.

В отличие от своих близких родственников — нодов материалов — ноды Blueprint имеют особые контакты, называемые контактами Execution. Контакт слева — это вход, контакт справа — выход. У всех нодов есть хотя бы по одному входу и выходу.

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

Unreal engine папка что это. image loader. Unreal engine папка что это фото. Unreal engine папка что это-image loader. картинка Unreal engine папка что это. картинка image loader

Node A и Node B будут выполняться, потому что у их входных контактов есть подключение. Node C и Node D никогда не выполняются, потому что входной контакт Node C не имеет подключения.

Вращение поворотного стола

Прежде чем начать, давайте посмотрим на панель Components. Можно заметить, что у Cylinder и Static Mesh есть отступ, а у DefaultSceneRoot — нет, потому что они подключены к DefaultSceneRoot.

Unreal engine папка что это. image loader. Unreal engine папка что это фото. Unreal engine папка что это-image loader. картинка Unreal engine папка что это. картинка image loader

Если переместить, повернуть или отмасштабировать корневой компонент, то тоже самое произойдёт и с прикреплёнными к нему компонентами. Благодаря этому поведению можно поворачивать Cylinder и Static Mesh одновременно, а не по отдельности.

Создание нода

Чтобы приступить к созданию скриптов, переключитесь назад на вкладку Event Graph.

Реализация вращения объекта настолько проста, что требует всего одного нода. Нажмите правой клавишей на пустое пространство в графе, чтобы открыть меню доступных нодов. Найдите AddLocalRotation. Нам нужно поворачивать основание и банан, поэтому мы просто будем вращать корневой компонент. Выберите AddLocalRotation (DefaultSceneRoot).

Примечание: если нода нет в списке, снимите флажок Context Sensitive в правом верхней части меню.

Unreal engine папка что это. image loader. Unreal engine папка что это фото. Unreal engine папка что это-image loader. картинка Unreal engine папка что это. картинка image loader

В вашем графе теперь появится новый нод AddLocalRotation. Вход Target автоматически подключится к выбранному компоненту.

Чтобы задать значение вращения, перейдите к входу Delta Rotation и измените значение Z на 1.0. Благодаря этому Blueprint сможет выполнять вращение относительно оси Z. Чем выше значения, тем быстрее будет вращаться стол.

Unreal engine папка что это. image loader. Unreal engine папка что это фото. Unreal engine папка что это-image loader. картинка Unreal engine папка что это. картинка image loader

Чтобы поворотный стол вращался постоянно, нужно вызывать AddLocalRotation в каждом кадре. Для выполнения нода в каждом кадре воспользуемся нодом Event Tick. Он уже находится в графе. Если его нет, то создайте его тем же способом, что и ранее.

Перетащите выходной контакт нода Event Tick ко входному контакту нода AddLocalRotation.

Unreal engine папка что это. image loader. Unreal engine папка что это фото. Unreal engine папка что это-image loader. картинка Unreal engine папка что это. картинка image loader

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

Наконец, перейдите в Toolbar и нажмите на Compile, чтобы обновить Blueprint, а затем закройте Blueprint editor.

Unreal engine папка что это. image loader. Unreal engine папка что это фото. Unreal engine папка что это-image loader. картинка Unreal engine папка что это. картинка image loader

Добавление Blueprints на уровень

Прежде чем добавлять Blueprint, вернитесь ко Viewport в основном редакторе и удалите модель банана. Для этого выберите модель, а затем выберите Edit\Delete или нажмите клавишу Delete.

Добавление Blueprint — это тот же процесс, что и добавление меша. Удерживайте левую клавишу мыши на файле и перетащите его во Viewport.

Перейдите к Toolbar и нажмите Play, чтобы увидеть результаты своих трудов!

Unreal engine папка что это. image loader. Unreal engine папка что это фото. Unreal engine папка что это-image loader. картинка Unreal engine папка что это. картинка image loader

Примечание: если вы не удалите исходную модель банана, то можете получить предупреждение о необходимости перестройки освещения. Если удалить модель, то ошибка больше не будет проявляться.

Что делать дальше?

Готовый проект можно скачать отсюда.

В этой части туториала вы многое узнали, но это только небольшая часть Unreal. Если вы хотите продолжить изучение, то ждите следующей части туториала, в которой мы подробнее рассмотрим Blueprints.

Источник

Прокачка статического анализа проектов на Unreal Engine 4 и проверка автосимулятора Carla

Одним из механизмов статического анализа является аннотирование методов популярных библиотек. Аннотации позволяют обладать большей информацией при диагностировании ошибок в коде. Впечатляющий свободный проект на С++ CARLA помог нам внедрить этот механизм. Впоследствии симулятор стал целью для проверки улучшенным статанализатором PVS-Studio.

Unreal engine папка что это. image loader. Unreal engine папка что это фото. Unreal engine папка что это-image loader. картинка Unreal engine папка что это. картинка image loader

Введение

CARLA – это симулятор с открытым исходным кодом для исследования автономного вождения. Проект был разработан с нуля для поддержки разработки, обучения и проверки автономных систем вождения. Помимо открытого исходного кода и протоколов, CARLA предоставляет открытые цифровые активы (городские планировки, здания, транспортные средства), которые были созданы для этой цели и могут использоваться свободно. Платформа моделирования поддерживает гибкую спецификацию комплектов датчиков и условий окружающей среды.

Проект является кроссплатформенным и содержит почти 78 000 строк кода на С++. В репозитории проекта также был найден код, написанный на Python, XML, YAML, DOS Batch, CMake и других языках.

Languagefilesblankcommentcode
C++26610334501650325
C/C++ Header44710091717627595
Python74870365119281
XML93047603
YAML01578525759
DOS Batch206274112462
Bourne Shell187783321922
CMake613337474
C#54730276
CSS14022206
JSON200137
make210060
Java15815159
Javascript1009
SUM9052717517682116168

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

Результатом проверки проектов является отчёт с предупреждениями. В PVS-Studio он может быть открыт в обычном редакторе, в утилите анализатора или в инструментах для разработки ПО, например в Visual Studio или CLion, с помощью соответствующих плагинов. Далее в статье вы найдёте топ-10 ошибок в проекте CARLA, а также сможете сами испытать свои силы в их поиске.

Сборка и анализ

Для сборки в Unreal Engine используется собственная сборочная система – Unreal Build Tool. Поэтому анализ проектов, написанных на движке Unreal Engine, выполняется особенным образом. Есть два варианта проверки UE-проектов:

CARLA использует модифицированное ядро Unreal Engine 4, которое также есть на GitHub. Однако доступ к репозиторию приватный, как и к самому Unreal Engine 4. Сборка симулятора на Windows состоит из двух этапов: сборка движка и сборка самого проекта. Мы рассмотрим, как проанализировать и то, и другое.

Сборка Unreal Engine 4

Сборку Unreal Engine 4 можно выполнить в 8 шагов.

Анализ Unreal Engine 4

Для проверки движка интегрируем статический анализ в сборочную систему Unreal Build Tool. Чтобы выполнить анализ и ознакомиться с результатами проверки, потребуется выполнить следующие действия.

Unreal engine папка что это. image loader. Unreal engine папка что это фото. Unreal engine папка что это-image loader. картинка Unreal engine папка что это. картинка image loader

В результате вместо сборки или пересборки проекта будет выполняться анализ исходного кода средствами PVS-Studio. Теперь приступим к сборке самого симулятора CARLA.

Сборка и анализ CARLA

Проект не генерирует solution, что не позволит нам интегрироваться в Unreal Build Tool. Поэтому мы воспользуемся вариантом проверки с отслеживанием вызовов компилятора. Существует два способа это сделать:

Unreal engine папка что это. image loader. Unreal engine папка что это фото. Unreal engine папка что это-image loader. картинка Unreal engine папка что это. картинка image loader

Обе утилиты уже есть в папке C:\Program Files (x86)\PVS-Studio после установки PVS-Studio. Мы воспользуемся вторым вариантом. Для сборки необходимо выполнить следующие действия.

Для удобного просмотра предупреждений анализатора можно открыть папку с репозиторием CARLA с помощью Visual Studio и загрузить отчёт. Затем будет полезно отфильтровать предупреждения на файлах ядра, автогенерированных файлах и подключаемых библиотеках. Для этого нужно выполнить ещё несколько действий:

Теперь можно изучать предупреждения анализатора в Visual Studio. Предупреждения будут только на коде симулятора CARLA и их собственных библиотеках.

Unreal engine папка что это. image loader. Unreal engine папка что это фото. Unreal engine папка что это-image loader. картинка Unreal engine папка что это. картинка image loader

Разборы ошибок, найденных в исходниках CARLA, отложим ненадолго. Дело в том, что анализ этого проекта нам был нужен ещё для одной задачи. Перед проверкой симулятора мы немного модифицировали ядро PVS-Studio так, чтобы оно собирало статистику вызовов методов Unreal Engine 4. Эти данные теперь помогут нам в аннотировании.

Аннотирование методов

Unreal engine папка что это. image loader. Unreal engine папка что это фото. Unreal engine папка что это-image loader. картинка Unreal engine папка что это. картинка image loader

Аннотирование выполняется в два этапа:

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

Например, аннотация может подсказать, что:

Какая аннотация была бы самой полезной? Хороший вопрос. Можем попробовать это выяснить в комментариях под статьей.

Аннотации не только помогают выявить новые ошибки, но и позволяют исключать некоторые ложные срабатывания.

Для чего же тут понадобился симулятор CARLA? Дело в том, что взять и проаннотировать все функции Unreal Engine 4 задача очень масштабная, требующая уйму времени. Когда-нибудь, быть может, мы её осилим, но сейчас мы решили начать с малого и посмотреть, что получится. Чтобы не брать первые попавшиеся 200 функций движка, было решено выявить наиболее популярные. Для этого мы нашли пару крупных проектов. Это довольно устаревшая игра Unreal Tournament и поддерживаемый на данный момент симулятор CARLA. Симулятор на С++ подошел нам по следующим причинам:

Итак, проекты выбраны. Они успешно собираются и анализируются. Что дальше? А дальше нам нужно собрать статистику по вызовам функций игрового движка. Как это сделать – вопрос интересный. К нашему счастью, под рукой – исходный код анализатора, который строит дерево разбора и позволяет выявлять вызовы функций со всей необходимой информацией. Поэтому достаточно было написать что-то похожее на новую диагностику. Функция нам подходила, если выполнялись два условия:

Если оба условия выполнялись, то информация о вызове записывалась в отдельный файл. Оставалось только запустить анализ с модифицированным ядром. После анализа мы получили лог функций. С помощью нескольких простых формул в Exсel, статистика приобрела следующий вид:

Unreal engine папка что это. image loader. Unreal engine папка что это фото. Unreal engine папка что это-image loader. картинка Unreal engine папка что это. картинка image loader

Мы посчитали, что для начала достаточно проаннотировать все функции, встретившиеся больше 10 раз. Их оказалось около 200. Так как программисты не очень любят документировать код, для аннотирования пришлось изучать реализацию каждой функции Unreal Engine 4 в исходном коде. В качестве примера приведу аннотацию функции ConstructUFunction:

Флаг F_ARG_ALLOC означает, что функция выделяет ресурс и отдает его через один из своих параметров. Флаг ALLOC_ARG указывает, что через первый параметр функции, а именно OutFunction, возвращается указатель на выделенный ресурс. Флаг SKIP говорит, что второй аргумент функции для нас не является особенным и неинтересен.

После того как все аннотации были написаны, мы ещё раз проверили симулятор CARLA и версию движка, которую он использует. Как и ожидалось, часть ложных срабатываний исчезла и появилось несколько новых предупреждений.

Новое предупреждение N1

V611 The memory was allocated using ‘new’ operator but was released using the ‘free’ function. Consider inspecting operation logics behind the ‘Allocation’ variable. Check lines: 1746, 1786. BulkData2.cpp 1746

Объект типа FOwnedBulkDataPtr создаётся с помощью оператора new и удаляется с помощью функции Free, которая вызывает std::free. Это может привести к неопределённому поведению. Срабатывание появилось после аннотирования функции FMemory::Free.

Новое предупреждение N2

V530 The return value of function ‘CalcCacheValueSize’ is required to be utilized. MemoryDerivedDataBackend.cpp 135

Возвращаемое значение метода CalcCacheValueSize не было использовано. Анализатор посчитал вызов этого метода без использования возвращаемого значения бесполезным. Просмотрев сигнатуры метода CalcCacheValueSize и заглянув в реализацию, анализатор понял, что функция не имеет состояния. Не меняются ни аргументы, ни свойства класса, ни какие-либо другие переменные. Это стало понятно благодаря тому, что внутри функции CalcCacheValueSize использовались проаннотированные методы. Бессмысленный вызов функции свидетельствует о возможной ошибке в логике программы.

Новое предупреждение N3

V630 The ‘Malloc’ function is used to allocate memory for an array of objects which are classes containing constructors. UnrealNames.cpp 639

Объекты типа FNameSlot создаются в обход существующего конструктора. Это подсказывает аннотация функции Malloc. В аннотации указано, что функция Malloc только выделяет память, при этом размер блока выделяемой памяти указан в первом аргументе. Данный код подозрителен и может привести к ошибкам.

Таким образом, аннотирование методов Unreal Engine позволяет выявлять новые ошибки. А теперь давайте приступим к изучению результатов проверки симулятора CARLA.

Результаты проверки

Unreal engine папка что это. image loader. Unreal engine папка что это фото. Unreal engine папка что это-image loader. картинка Unreal engine папка что это. картинка image loader

Предупреждение N1

V522 Dereferencing of the null pointer ‘CarlaActor’ might take place. CarlaServer.cpp 1652

Один потерянный восклицательный знак – и функция полностью меняет поведение. Теперь в случае валидности CarlaActor выбрасывается ошибка, а в случае nullptr функция приводит к неопределённому поведению, которым может быть аварийное завершение программы.

Предупреждение N2

Похожее предупреждение анализатор выдал в другой функции.

V522 Dereferencing of the null pointer ‘HISMCompPtr’ might take place. ProceduralBuilding.cpp 32

Когда поиск SMName в HISMComps завершается успехом метод GetHISMComp возвращает найденный элемент. В противном случае преждевременный выход из метода не осуществляется, но происходит разыменовывание нулевого указателя HISMCompPtr, что становится причиной неопределённого поведения. Скорее всего, инициализация в определении HISMComp была лишней. Сразу следом HISMComp принимает новое значение.

Предупреждение N3

V547 Expression ‘m_trail == 0’ is always false. unpack.hpp 699

Переменная tmp имеет тип uint8_t, а значит диапазон её значений от 0 до 255. Переменная m_trail принимает значение на 1 больше, поэтому её диапазон возможных значений от 1 до 256. Так как m_trail в условии не может быть равной 0, инструкции в теле условия никогда не будут выполнены. Такой код может быть как избыточным, так и не соответствующим задумкам автора. Следует его проверить.

Анализатор нашёл ещё несколько похожих фрагментов кода:

Предупреждение N4

Очень похожая ситуация встретилась и в другой функции.

V547 Expression ‘(uint8) WheelLocation >= 0’ is always true. Unsigned type value is always >= 0. CARLAWheeledVehicle.cpp 510

Некая функция проверки check принимает своим аргументом значение типа bool и вызывает исключение, если было передано значение false. В первой проверке выражение всегда будет иметь значение true, так как тип uint8 имеет диапазон от 0 до 255. Возможно, в содержимом check допущена опечатка. Точно такая же проверка есть в строке 524.

Предупреждение N5

V547 Expression ’rounds > 1′ is always true. CarlaExporter.cpp 137

А вот тут явная опечатка. Вместо round используется rounds. Допустить ошибку в одной букве легко, особенно в конце тяжёлого рабочего дня. Все мы люди и устаём. А вот статический анализатор кода – это программа, и она всегда работает с одинаковой бдительностью. Поэтому хорошо иметь такой инструмент под рукой. Разбавлю код картинкой с графикой симулятора.

Unreal engine папка что это. image loader. Unreal engine папка что это фото. Unreal engine папка что это-image loader. картинка Unreal engine папка что это. картинка image loader

Предупреждение N6

V612 An unconditional ‘return’ within a loop. EndPoint.h 84

Цикл while, условие, инкрементирование итератора – всё это говорит, что инструкции в блоке должны выполняться больше одного раза. Однако из-за return будет выполнена лишь одна итерация. Наверняка, тут должна быть другая логика, иначе цикл можно устранить.

Предупреждение N7

V794 The assignment operator should be protected from the case of ‘this == &other’. cpp11_zone.hpp 92

Анализатор обнаружил перегрузку оператора присваивания, в котором не осуществляется проверка this == &other. Вызов деструктора через указатель this приводит к потере данных other. Впоследствии оператор присваивания возвращает копию очищенного объекта. Анализатор выявил ещё несколько таких потенциальных ошибок:

Предупреждение N8

V1030 The ‘signals’ variable is used after it was moved. MapBuilder.cpp 926

Контейнер signals после перемещения станет пустым, и цикл range-based for не отработает. Правильным было бы использовать controller_pair.first->second->_signals:

Однако так было бы правильно, если бы не одно «но». Контейнер signals имеет спецификатор const, а значит, не может быть перемещен. Вместо этого он будет скопирован, и поэтому программа логически работает правильно. Программист, который хотел оптимизировать код, смог запутать и себя, и анализатор. Спасибо ему за этот код, теперь мы учтём подобную ситуацию при доработке диагностики V1030, а может, даже напишем новую.

Предупреждение N9

V1061 Extending the ‘std’ namespace may result in undefined behavior. Waypoint.cpp 11

Рассмотрим два фрагмента кода из файлов Waypoint.h и Waypoint.cpp:

В заголовочном файле пространство имен std расширяется явной специализацией шаблона класса hash для работы с типом carla::road::element::Waypoint. В файле Waypoint.cpp в std добавляют псевдоним структуры WaypointHash и реализацию оператора вызова функции operator().

Вообще стандарт С++ запрещает расширять пространство имен std, так как его содержимое определяется исключительно комитетом стандартизации и меняется от версии языка С++. Модификация данных в этом пространстве имён может привести к неопределенному поведению. Однако добавление явной или частичной специализации шаблона, как в файле Waypoint.h, является исключением. Реализация оператора вызова функции в файле Waypoint.cpp тоже допустима, а вот декларации псевдонима в пространстве имен std не должно быть, о чём сообщает диагностика V1061.

На самом деле, вовсе не обязательно так расширять пространство имён std. Достаточно добавить специализацию шаблона std::hash для пользовательского типа за пределами std (да, так можно):

Предупреждение N10

Unreal engine папка что это. image loader. Unreal engine папка что это фото. Unreal engine папка что это-image loader. картинка Unreal engine папка что это. картинка image loader

Одну интересную ошибку я оставил напоследок. Предлагаю найти её самостоятельно. Она, в отличие от остальных, из самого игрового движка Unreal Engine 4.

Unreal engine папка что это. image loader. Unreal engine папка что это фото. Unreal engine папка что это-image loader. картинка Unreal engine папка что это. картинка image loader

V666 Consider inspecting third argument of the function ‘strncmp’. It is possible that the value does not correspond with the length of a string which was passed with the second argument. GlslBackend.cpp 943

Ошибка в вызове функции strncmp:

Третьим аргументом функции передается число сравниваемых символов, а во втором – строковый литерал. В базе данных анализатора имеется аннотация стандартной функции strncmp, которая подсказывает, что число символов, вероятно, должно совпадать с длиной строкового литерала. К тому же для предыдущих вызовов функции strncmp число символов действительно совпадало с длиной строкового литерала. Однако в приведённом фрагменте кода функция сравнивает только часть строки. Проверка

бессмысленна, так как bBuiltinVariable уже содержит результат такой же проверки:

Скорее всего, вызов функции должен был выглядеть так:

Заключение

Симулятор CARLA не только интересный и полезный проект на Unreal Engine 4, но и довольно качественный. Использование статического анализа ведёт к уменьшению времени на разработку и отладку приложений, а аннотирование функций помогает выполнять более точный анализ. Спасибо авторам этого чудесного проекта за возможность исследования кода на предмет частоты использования функций UE4.

Ещё больше про статический анализ в видеоигровой индустрии и топ-10 программных ошибок можно почитать здесь.

Unreal engine папка что это. image loader. Unreal engine папка что это фото. Unreal engine папка что это-image loader. картинка Unreal engine папка что это. картинка image loader

Как и другие инструменты С++ программистов, статические анализаторы кода не стоят на одном месте и постоянно развиваются. Про это и многое другое можно почитать в свежей статье.

Если хотите поделиться этой статьей с англоязычной аудиторией, то прошу использовать ссылку на перевод: Konstantin Kochkin. How the Carla car simulator helped us level up the static analysis of Unreal Engine 4 projects.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *