Введение в C ++ Программирование на UE4 1 часть
Перевод начинается с (Gameplay Classes: Objects, Actors, and Components) ссылка
Классы геймплея: предметы, актёры, компоненты.
В Unreal Есть 4 основных класса которые вы будете использовать постоянно, это UObject, AActor, UActorComponent, и UStruct. Каждый блок описан в разделах ниже. Конечно можно создавать свои блоки, но тогда они не будут участвовать в движке. Простое создание классов которые создаются за пределами ираркии это UObject
Unreal Objects (UObject) (Unreal Объекты)
Базовая структура движка Unreal Вызывает UObject. Этот класс в сочитании с классом UClass предоставляет ряд важных базовых сервисов движка:
- Reflection of properties and methods (Отражение своиств и методов)
- Serialization of properties (Сериализация своиств)
- Garbage collection (Очистка коллекций)
- Finding UObjects by name (Поиск объектов по имени)
- Configurable values for properties (Конфигурация значений для свойств)
- Networking support for properties and methods (Поддержка методов и свойтсв для сети)
Каждый класс являющийся производным от UObject создаёт синглтон UClass контейнер который содержт все данные о экземпляре класса. UObject и UClass отвечают за работу объекта за всё время существования объекта во время геймплея. Разница между UClass и UObject заключается в том, что UClass описывает как будет выглядеть экземпляр класса UObjects и какие своиства доступны для сериализации, взаимодействия и так далее. Вам не обязательно знать какие детали UClass/UObject работы, при написани игрового кода, но знать о существовании таких классов необходимо.
AActor (Актёр)
AActor предназначен для того что-бы быть частью игрового процесса. AActor либо помещаются дизайнером при создании уровня или создаются в геймплей системе при работе геймплей системы. Все объекты которые создаются на игровом уровне унаследованы от этого класса. Например такие классы как AStaticMeshActor, ACameraActor и APointLight. AActor наследуется от UObject и использует весь стандартный функционал описанный в прошлом разделе. AActors может быть уничтожен с помощью кода в С++ или в Blueprint, а так же стандартным сборщиком мусора (деструктор). AActor отвечает за поведение объектов во время игры. AActor так же является базовым типом который можно реплицировать в течении игры по сети. При репликации, AActor может распространять информацию о всех компонентах UActorComponents которые принадлежат AActor требующие поддержку сети.
AActors имеет свои собственные модели поведения (которые наследуются), но они так же выступают в качестве контейнера для иерархий UActorComponents. Делается это с помощью RootComponent который является членом AActor’s и который в свою очередь содержит UActorComponent и может содержать множество других объектов. Перед тем как AActor вы разместите на уровне, он должен содержать USceneComponent , который должен содержать информацию о вращении, масштабе, координатах расположения для AActor. Кто не понял приведу на английском
This is done through the AActor’s RootComponent member, which contains a single UActorComponent that, in turn, can contain many others. Before an AActor can be placed in a level, that AActor must contain at least a USceneComponent which contains the translation, rotation, and scale for that AActor.
AActors содержит ряд событий которые вызываются в течении всего жизненного цикла AActor:
- BeginPlay – вызывается при первом появлении объекта в игровом движке
- Tick – вызывается каждый кадр, при геймплее
- EndPlay – вызывается когда объект покидает игровое поле.
Познакомиться со всеми Actors можно детально по ссылке на английском
Runtime Lifecycle(жизненный цикл)
Создание актёра достаточно сложный процесс. Первоначально должны быть загружены все своиства , такие как расположение актёра, вращение и так далее. Должна проёти первоначальная регистрация всех компонентов. Создание актёров идёт через порождение объекта AActor. Физика движка должна знать о том что произойдёт после создания. За порождение актёра отвечает UWorld::SpawnActor().После создания актёра вызывается метод BeginPlay() , а следом вызывается Tick().
После того как актёр выполнил свою работу, его можно уничтожить вызовом Destroy(). При выполнении этого процесса будет вызван метод EndPlay() где можно задать пользовательскую логику. Ещё один вариант уничтожения является задание времени жизни текущего актёра через контролер и объект так же будет уничтожен через Destroy().
UActorComponent
UActorComponents имеет свои собственные модели поведения и как правило отвечает за функциональность, которая совместно используется с AActors, например предоставление визуальных сетки, эффекты частиц, перспективы камеры, и физика взаимодействий. В то время как AActors даёт низкоуровневое связывание всех ролей в вашей игры, UActorComponents как правило выполняет индивидуальные задачи, которые поддерживаются на высоком уровне. Компоненты можно прикрепить к другим компонентам или может быть корнем компонентам Actor. Компоненты можно прикрепить только к одному родительскому компоненту, тогда как Actor может иметь много дочерних компонентов являясь родителем.
- RootComponent – Это член AActor который является компонентом высокого уровня и содержит в себе дерево других компонентов
- Ticking – это компоненты которые являются частью наследуемого AActor’s Tick()
Анализируем персонаж от первого лица
Что бы проанализировать и понять принцип взаимодействия AActor и UActorComponents давайте посмотрим в blueprint в шаблоне от первого лица, который есть при создании проекта. На рисунке ниже показано дерево компонентов для FirstPersonCharacter. Корневым компонентом является CapsuleComponent. К CapsuleComponent прикреплён ArrowComponent, Mesh компонент, и FirstPersonCameraComponent (камера от первого лица). В свою очередь у Mesh1P родителем является FirstPersonCameraComponent.
Визуально на рисунке ниже можно наблюдать как в 3д пространсте распологаются и выглядят компоненты, за исключением компонента Mesh.
Это дерево компонентов присоединено к одному классу actor. Используя наследование можно наследовать и настроить существующие классы AActor или UActorComponent. Так же на текущем примере вы можете создавать сложные уровни наследуя классы или используя паттерн композиция, подключая другие классы.
UStruct
При использовании UStruct, вы не можете наследовать какой то класс, вы просто должны отметить должны отметить структуру с USTRUCT() и ваши тулзы при сборке проекта будут делать основную работу за вас.
Unlike a UObject, UStructs are not garbage collected. If you create dynamic instances of them, you must manage their lifecycle yourself. UStructs are meant to be plain old data types that have the UObject reflection support for editing within the Unreal Editor, Blueprint manipulation, serialization, networking, etc.
Unreal Reflection System(Unreal рефлексия)
Классы геймплея используют специальную разметку, позволяющую реализовать собственный сборщик муссора, сериализацию, поддержку сети и так далее.Особенности выбора гарантируют то что Unreal правильно обработает ваши типы и функции и не проигнорирует их при сборке проекта.
- UCLASS() сообщает Unreal, что тот должен сгенерировать данные для отражения класса, который в свою очередь является производным от UObject
- STRUCT() -говорит Unreal, что должны быть сгенерированы данные для структуры.
- GENERATED_BODY() – заменяет шаблонный код
- UPROPERTY()
- UFUNCTION()