- разница между Visual Studio C++ и Unreal Engine C++
- типы переменных
- String на FString
- double не пренемается Blueprint
- типы переменных
- файл sln открывает проект в C++
- файл uproject открывает проект в Unreal Engine
- При изменении кода требуется компиляция
- В IDE Build\Build ИмяПроекта
- В Редакторе Значок Кубики
- кнопка создания
- Content Browser Add New\New C++ Class…
- File\Project-New C++ Class…
- Add C++ Class окно создания класса
- располагаются все возможные классы, которые мы можем создать и от которых мы хотим наследоваться
- это добавит заголовок C++ и файл исходного кода в ваш игровой проект
- Show All Classes
можно посмотреть все возможные классы, представленные в Unreal Engine - Actor базовый класс
- Name задаётся имя класса
- Path задаётся расположение класса
- Create Class генерация и компилирование файлов нового класса
- Заголовочный файл h
- объявление класса
- объявление переменных
- объявление функций
- сразу создаётся несколько функций
- BeginPlay
- Tick
#pragma once
#include "GameFramework/Actor.h"
#include "MyFirstActor.generated.h"
UCLASS()
class TUTORIAL_API AMyFirstActor: public AActor
{
GENERATED_BODY()
public:
AMyFirstActor();
protected
virtual void BeginPlay() override;
public:
virtual void Tick(float DeltaTime) override;
}
- cpp
- задаём что происходит в любой функции
#include "Tutorial.h"
#include "MyFistActor.h"
//конструктор, который вызывается при создании инстанса объекта
//когда мы наш объект размещаем на сцене
AMyFistActor::AMyFistActor()
{
//отключение вызова функции Tick для производительности
PrimaryActorTick.bCanEverTick = true;
}
//вызывается в самом начале игры, если объект стоит на сцене
//так же вызывается после создания объекта (конструктора)
void AMyFisrtActor::BeginPlay()
{
Super::BeginPlay();
}
//вызывается каждый кадр
void AMyFisrtActor::Tick(float DeltaTime)
{
Super::Tick(DeltaTime);
}
- От созданного класса
- C++ мы можем наследоваться
Create C++ class derived from MyFirstActor - Blueprint создаём на основе класса
Create Blueprint class based on MyFirstActor - Name имя blueprint
- Path расположение файла blueprint
- C++ мы можем наследоваться
- Объект нового класса можно разместить на сцене,
но при минимальном коде:- не можем найти на сцене
только через WorldOutline
- У объекта нет координат
- не можем найти на сцене
//при объявлении в классе переменной в этом случае это поле не
//будет отображаться в blueprint и в общем редактор не знает о
//нашей переменной
class TUTORIAL_API AMyFisrtActor: public AActor
{
bool myBool;
}
- необходимо задавать макрос
UPROPERTY- параметры
- VisibleAnywhere
можем читать, но не можем записать
переменная будет видна, но мы с ней ни чего не сможем сделать - EditDefaultsOnly
- в blueprint мы можем устанавливать значение по умолчанию
- при наследовании классов мы можем устанавливать различные default значения переменной
- на сцене мы все равно переменную не сможем увидеть
- EditAnywhere
- мы можем полностью изменять переменную как на сцене, так и на blueprint и создавать экземпляры, в которых может быть различные default значения переменной
- мы не можем прочесть или записать в blueprint коде, только в настройках
- BlueprintReadOnly
- мы можем только читать переменную в коде Blueprint
- BlueprintReadWrite
- мы можем прочитать и записать переменную в коде Blueprint
- Set
- Get
- мы можем прочитать и записать переменную в коде Blueprint
- Category = «Имя группы»
- разделение по группам
- VisibleDefaultOnly
- переменная видна только в default
- Replicated
- позволяет нам сделать видимой переменную и на сервере и на клиенте
- ReplicatedUsing
- вызывание функции для выставления параметра для переменной
- VisibleAnywhere
- параметры
class TUTORIAL_API AMyFisrtActor: public AActor
{
UPROPERTY(VisibleAnywhere)
bool myBool;
}
- Типы переменных
//простые переменные
bool var1;
byte var2;
int32 var3;
float var4;
double var5;
//простые переменные unreal
FVector MyVector;
FString MyString;
FTransform MyTransform;
FText MyText;
FRotator MyRotator;
FName MyName;
//классы unreal
AActor* MyActor; объекту указывается pointer *
- поинтер записанный адрес объекта *
- инстанс конкретного объекта переменный записанный объект
- ссылки на структуры могут быть инстансы
- референс записанная ссылка или адрес самого объекта &
3. Создание и добавление своих компонентов
в С++ вместо Blueprint
- Создание в классе контейнера, где будет лежать наш компонент
- Каждый тип компонента прописывается с приставкой
- AActor все объекты типа Actor помечаются A
- U компоненты живут внутри объекта или класса
- Blueprint
- у объекта компонент-переменная создаётся автоматически
- в неё записалась ссылка на наш компонент
- С++
- необходимо делать все вручную
- объявление макроса UPROPERTY
- объявить переменную и задать тип переменной компонента в файле .h
- необходимо делать все вручную
//мы задали место, где будет хранится наш компонент, но не
//создали его
UPROPERTY()
UStaticMeshComponent* MyMeshComponent;
- в файле cpp в конструкторе создаётся наш объект
- для создания объекта используется макрос CreateDefaultSubobject
- TEXT макрос создаёт текстовую переменную
- RootComponent это переменная,
которая встроена в сам Actor наследовал- обозначает якорный компонент или самый главный компонент
- созданный компонент будет везде стоять вместо наследуемого root
AMyFistActor::AMyFistActor()
{
MyMeshComponent = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("MyMesh"));
RootComponent = MyMeshComponent;
}
- Компоненты в C++ и Blueprint
- UStaticMeshComponent
- SetStaticMesh
- SetMaterial
- AddLocalRotation
- Создать движение для компонента по сцене
- USceneComponent
- существует сцена, под которые помещаются сами объекты и которые можно перемещать, в отличие от самой сцены
- в классе создается ссылка переменная USceneComponent для перемещения объекта
- USceneComponent
- UStaticMeshComponent
AMyFistActor::AMyFistActor()
{
MyMeshComponent = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("MyMesh"));
MySceneComponent = CreateDefaultSubobject<USceneComponent>(TEXT("MyScene"));
RootComponent = MyMeshComponent;
-> вызов функции по адресу поинтеру
. вызов функции у инстанса
MyMeshComponent->SetupAttachment(RootComponent);
}
- Вращение объекта
void AMyFisrtActor::Tick(float DeltaTime)
{
Super::Tick(DeltaTime);
MyMeshComponent->AddLocalRotation(FRotator(0.f,0.f,1.f),false);
}