Unreal Engine 4 c++ tips and tricks
From ИМЛ Вики
Вывод сообщения на экран игры (аналог 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;