UE4简单功能——C++小功能

一、任意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());
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值