Рубрики
Unreal Engine "C++" Unreal Engine C++ "Уроки"

Уровень 0 «Основы»

  • разница между 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
  • Объект нового класса можно разместить на сцене,
    но при минимальном коде:
    • не можем найти на сцене
      только через 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
      • Category = «Имя группы»
        • разделение по группам
      • VisibleDefaultOnly
        • переменная видна только в default
      • Replicated
        • позволяет нам сделать видимой переменную и на сервере и на клиенте
      • ReplicatedUsing
        • вызывание функции для выставления параметра для переменной
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 *
  • поинтер записанный адрес объекта *
  • инстанс конкретного объекта переменный записанный объект
    • ссылки на структуры могут быть инстансы
  • референс записанная ссылка или адрес самого объекта &
  • Создание в классе контейнера, где будет лежать наш компонент
  • Каждый тип компонента прописывается с приставкой
    • 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 для перемещения объекта
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);
}