16 UE5 UObject简单介绍和定义

2024-03-14  本文已影响0人  游戏开发程序员

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; // 依然有效
    }
上一篇 下一篇

猜你喜欢

热点阅读