一、任意ENUM枚举与FString、FName互相转换
基本思路:通过名字Enum名查找到对应的ENUM,然后调用对应函数,粗暴且效率不高,胜在逻辑简单。
//ENUM转FString
template<typename TEnum>
FORCEINLINE FString (Enum2String)(const FString &Name, TEnum Value)
{
const UEnum* EnumPtr = FindObject<UEnum>(ANY_PACKAGE, *Name, true);
if (!EnumPtr)
{
return FString("InValid");
}
return EnumPtr->GetNameByValue((int32)Value).ToString();
//return EnumPtr->getname((int32)Value);
}
//ENUM转Name
template<typename TEnum>
FORCEINLINE FName Enum2Name(const FString &Name, TEnum Value)
{
const UEnum* EnumPtr = FindObject<UEnum>(ANY_PACKAGE, *Name, true);
if (!EnumPtr)
{
return FName("InValid");
}
return FName(*(EnumPtr->GetNameStringByIndex((int32)Value)));
}
//String转Enum
template<typename TEnum>
FORCEINLINE TEnum String2Enum(const FString &Name, FName Value)
{
const UEnum* EnumPtr = FindObject<UEnum>(const FString& Name, FNmae Value);
if (!EnumPtr)
{
return TEnum(0);
}
return TEnum(EnumPtr->GetIndexByName(value));
}
使用示例:
Enum2String<EMyEnum>("EMyEnum", EMyEnum::Enum1);
二、快速遍历场景中的AActor
思路:利用TActorIterator,获取World中对应Actor的迭代器
//记得引入EngineUtils.h
for (TActorIterator<AMyActor> it(GetWorld(),AMyActor::StaticClass());it;++it)
{
//获取到原生指针
AMyActor* TarActor = *it;
//DoAnyThing
...
}
三、快速从txt中获取string
bool MethodUnit::LoadFileToString(FString& str,const FString& path)
{
//获取项目根目录路径
FString filePath = FPaths::ProjectDir()+path;
//如果该文件不存在
if (!FPlatformFileManager::Get().GetPlatformFile().FileExists(*filePath))
{
//打印失败信息
GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Red, TEXT("** Could not Find File **"));
return false;
}
//将文件写入到str
FFileHelper::LoadFileToString(str,*filePath);
return true;
}
四、编辑器内属性变化时的回调
利用PostEditChangeProperty
可以通过属性名和属性内容实现对其他内容的调整
五、使用FindObject+LoadObject替代单独的LoadObject
LoadObject
会先查找UPackage,然后再查找对应的UObject
。如果资源已经在内存,FindObject
跳过查找UPackage
直接对UObjec
查找。
六、Log等字符串操作
输出函数名
使用宏 FUNCTION 直接输出函数名
TEXT("%hs"), __FUNCTION__
七、断言的简单使用
ensureMsgf
if (ensureMsgf(Sections.Num() >0, TEXT("Round[%s] can't get random sections"), *GameRoundId.ID.ToString()))
八、结构体Struct
FTableRowHandle与RowType
可以使用**meta=(RowType=结构体名)**来限制RowHandle选择数据表类型
- 结构体名需要去除前缀 F (FTestStruct(X)->TestStruct(√))
struct FStructType;
UPROPERTY(meta=(RowType=StructType))
FTableRowHandle RowHandle;
九、枚举Enum
-
- BitMask可以使用位运算
-
- 可以使用Hidden宏将特定元素隐藏
UENUM(BlueprintType, meta = (Bitflags, UseEnumValuesAsMaskValuesInEditor = "true"))
enum class EState : uint8
{
None = 0 UMETA(Hidden),
Normal = 1 << 0,
Injured = 1 << 1, // Need Recovery
State2 = 1 << 2,
Dead = 1 << 4,
};
ENUM_CLASS_FLAGS(EState)
十、拷贝一个大的数据类,可以先序列化,然后反序列化出一个副本
对UObj数组的序列化
for (auto LcoalDepartment : Departments)
{
FString ClassPath = LcoalDepartment->GetClass()->GetPathName();
Ar << ClassPath;
LcoalDepartment->Serialize(Ar);
}
十一、SubSystem
设置初始化依赖关系
void UOPCustomManager1::Initialize(FSubsystemCollectionBase& Collection)
{
//此时UOPCustomManager2一定在UOPCustomManager1之前完成初始化
Collection.InitializeDependency(UOPCustomManager2::StaticClass());
}