UObject 核心功能
- 反射:动态根据类型创建对象,遍历属性成员,根据名字调用函数等.
- 网络复制功能
- 运行时类型识别 RTTI(Run-Time Type Identification)
- EDIT交互功能:编辑器交互.
- GC 垃圾回收:内存管理和释放.
- 序列化:存档和读档,存入package里.
UObject的简单实现和调用
- 通过编辑器上创建一个继承UObject的类
- 定义几个成员变量和函数 用于学习反射等功能
#include "CoreMinimal.h"
#include "UObject/NoExportTypes.h"
#include "TestObject.generated.h"
/**
* 测试使用的UObject对象
*/
UCLASS()
class UTestObject : public UObject
{
GENERATED_BODY()
public:
UPROPERTY(BlueprintReadWrite, Category = "Property")
FString CurPlayerName;
UPROPERTY(BlueprintReadWrite, Category = "Property")
int32 CurPlayerAge;
UFUNCTION(BlueprintCallable, Category = "Property")
FString GetOutInfo(FString CallerName);
// C++定义 蓝图可调用 UHT声明exec前缀函数 DECLARE_FUNCTION(execIsBoy);
UFUNCTION(BlueprintCallable, Category = "Function")
bool IsBoy();
// C++定义 蓝图可调用/重写 UHT声明exec前缀函数 DECLARE_FUNCTION(execIsGirl);
UFUNCTION(BlueprintNativeEvent, Category = "Function")
// c++函数定义为: bool UMyObject::IsGirl_Implementation()
bool IsGirl();
// C++声明和调用 蓝图去实现
UFUNCTION(BlueprintImplementableEvent)
bool IsBaBy();
};
#include "Character/TestObject.h"
#include "TestObject.h"
FString UTestObject::GetOutInfo(FString CallerName)
{
return CallerName + TEXT(" call GetOutInfo!");
}
bool UTestObject::IsBoy()
{
return false;
}
bool UTestObject::IsGirl_Implementation()
{
return false;
}
简单的创建,销毁和存档。
// UObject
if(1)
{
UTestObject* pObj = NewObject<UTestObject>();
pObj->CurPlayerName = TEXT("Mike");
pObj->CurPlayerAge = 38;
// UObject存档功能
FString AssetPath = TEXT("/Game/Link");
// 全路径,MyGame/Content/MyObject.uasset
FString PackageFileName = FPackageName::LongPackageNameToFilename(
AssetPath, FPackageName::GetAssetPackageExtension());
FString ObjectName = TEXT("Mike");
// 不存在,直接保存
if (!FPaths::FileExists(PackageFileName))
{
bool bSaved = SaveData(AssetPath, PackageFileName, ObjectName);
UE_LOG(TestLog, Display, TEXT("Save Package %s !"), bSaved?TEXT("Success"):TEXT("Failed"));
}
else // 存在,加载
{
UPackage* pPkg = LoadPackage(nullptr, *AssetPath, LOAD_None);
if(pPkg)
{
pPkg->FullyLoad();
auto info = pPkg->GetDetailedInfo();
}
}
// 异步执行且对象在当前帧内持续有效 等GC触发后失效
pObj->ConditionalBeginDestroy();
auto age = pObj->CurPlayerAge; // 依然有效
}
网友评论