Unreal Engine 4 c++ tips and tricks

From ИМЛ Вики
Jump to: navigation, search

Вывод сообщения на экран игры (аналог Print String на с++)

#include "Engine.h"

GEngine->AddOnScreenDebugMessage(-1, 5.0f, FColor::Red, FString::Printf(TEXT("Your Text")));

Вывод сообщения в лог

int variable1 = 2;
int variable2 = 3;
UE_LOG(LogTemp, Warning, TEXT("Your text, parametr1 = %d, parametr2 = %d"), variable1, variable2);

Получение ссылки на класс

  • Получение ссылки на блупринт класс в кострукторе класса (вне конструктора не работает) через ConstructorHelpers::FClassFinder.

#include "ServerAIController.h"

static ConstructorHelpers::FClassFinder<AServerAIController> AIControllerRef (TEXT("/Game/ServerAIClasses/ServerAIControllerBP"));
	AIControllerClass = AIControllerRef.Class;

Практически всегда используется если вы устанавливаете Class Defaults (параметры по-умолчанию) в с++ классе

  • Получение ссылки на блупринт класс в реалтайме (во всех методах класса кроме конструктора)

UBlueprint* SpawnActor = Cast<UBlueprint>(StaticLoadObject(UObject::StaticClass(), NULL, TEXT("/Game/ServerAIClasses/ServerAICharacterBP")));
UClass* SpawnActorClass = SpawnActor->GeneratedClass;

Переменную SpawnActorClass сразу же можно скармливать функции UWorld::SpawnActor

  • Получение ссылки на блупринт класс через TSubclassOf<>. Если вы хотите получить на блупринтах выпадающий список в котором сможете выбирать разные производные классы от указанного.

UPROPERTY(EditAnywhere, BlueprintReadWrite)
TSubclassOf<class AActor> SpawnActorClass;

Переменную SpawnActorClass сразу же можно скармливать функции UWorld::SpawnActor

  • Получение ссылки на класс с++

#include "ServerAIController.h"

AIControllerClass = AServerAIController::StaticClass();

Переменную AIControllerClass сразу же можно скармливать функции UWorld::SpawnActor

Комплексное решение: получение жесткой ссылки блупринт класс эктора и его спавн в реалтайме

  • Короткое решение

UBlueprint* SpawnActor = Cast<UBlueprint>(StaticLoadObject(UObject::StaticClass(), NULL, TEXT("/Game/ServerAIClasses/ServerAICharacterBP"))); // записываем ссылку на блупринт в переменную
UClass* SpawnActorClass = SpawnActor->GeneratedClass; // достаем из блупринта его статический класс и записываем его в переменную

FActorSpawnParameters SpawnParams; // создаем переменную с параментрами для спавна, которая нужна для функции UWorld::SpawnActor
SpawnParams.Owner = this; // задаем себя как владельца бдущущего проспавненого объекта
SpawnParams.SpawnCollisionHandlingOverride = ESpawnActorCollisionHandlingMethod::AlwaysSpawn; // задаем дабы эктор спавнился вне завимисости от колизии, есть ли ему место в указанных координатах
AActor* Bot = GetWorld()->SpawnActor<AActor>(SpawnActorClass, FVector::ZeroVector, FRotator::ZeroRotator, SpawnParams); // спавним эктора
  • Длинное решение с кучей проверок

#include "Engine.h"

UObject* SpawnActor = Cast<UObject>(StaticLoadObject(UObject::StaticClass(), NULL, TEXT("/Game/DEXIED/Foliage/Tree/BP_TreeDestroyed_Style_1.BP_TreeDestroyed_Style_1")));

UBlueprint* GeneratedBP = Cast<UBlueprint>(SpawnActor);
if (!SpawnActor)
{
GEngine->AddOnScreenDebugMessage(-1, 1.f, FColor::Red, FString::Printf(TEXT("CANT FIND OBJECT TO SPAWN")));
return;
}

UClass* SpawnClass = SpawnActor->StaticClass();
if (SpawnClass == NULL)
{
GEngine->AddOnScreenDebugMessage(-1, 1.f, FColor::Red, FString::Printf(TEXT("CLASS == NULL")));
return;
}

UWorld* World = GetWorld();
FActorSpawnParameters SpawnParams;
SpawnParams.Owner = this;
SpawnParams.SpawnCollisionHandlingOverride = ESpawnActorCollisionHandlingMethod::AlwaysSpawn;
World->SpawnActor<AActor>(GeneratedBP->GeneratedClass, GetActorLocation(), GetActorRotation(), SpawnParams);

Булевая переменная, от состояния которой зависит возможность изменения других переменных

  • В данном случае переменная SecondVariable будет доступна для изменения в ClassDefaults на блупринтах, только при значении bFirstVariable = true.
UPROPERTY(EditAnywhere)
	bool bFirstVariable;

UPROPERTY(EditAnywhere, Meta = (EditCondition = bFirstVariable))
	int32 SecondVariable;