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