UE5中TSoftObjectPtr的使用详解

时间:2025-04-07 12:29:50

文章目录

  • 前言
  • 一、TSoftObjectPtr 的核心特性
  • 二、基本用法示例
    • 2.1 声明与赋值
  • 二、同步加载资源
  • 三、异步加载示例
  • 四、蓝图中的TSoftObjectPtr
  • 五、注意事项
  • 六、对比硬引用
  • 总结


前言

在UE5中,TSoftObjectPtr 是一种重要的资源管理工具,它允许开发者以“软引用”的方式引用资源(如纹理、模型、蓝图等),而不会强制资源立即加载到内存中。这种机制特别适用于需要动态加载资源的场景,例如开放世界中的流送系统或按需加载资源。以下是详细说明和具体示例:


一、TSoftObjectPtr 的核心特性

  • 延迟加载:仅保存资源路径,不主动加载资源。
  • 安全性:自动处理资源卸载后的引用失效问题。
  • 兼容性:支持蓝图和C++,可与AsyncLoad配合实现异步加载。
  • 内存优化:避免不必要的内存占用,按需加载。

二、基本用法示例

2.1 声明与赋值

在C++类中声明一个TSoftObjectPtr成员变量,引用一个纹理资源:

// Header File (.h)
#pragma once

#include "CoreMinimal.h"
#include "UObject/SoftObjectPtr.h"

UCLASS()
class YOURPROJECT_API AMyActor : public AActor
{
    GENERATED_BODY()

public:
    UPROPERTY(EditAnywhere, Category = "Resources")
    TSoftObjectPtr<UTexture2D> SoftTexture; // 声明软引用纹理

    void LoadAndUseTexture();
};

在编辑器细节面板中,可以直接为SoftTexture指定一个纹理资源(如T_ExampleTexture)。

二、同步加载资源

通过**LoadSynchronous()**同步加载资源:

// Source File (.cpp)
#include "MyActor.h"

void AMyActor::LoadAndUseTexture()
{
    UTexture2D* Texture = SoftTexture.LoadSynchronous(); // 同步加载
    if (Texture)
    {
        // 使用纹理,例如赋值给材质
        UE_LOG(LogTemp, Warning, TEXT("Texture loaded: %s"), *Texture->GetName());
    }
    else
    {
        UE_LOG(LogTemp, Error, TEXT("Failed to load texture!"));
    }
}

三、异步加载示例

使用StreamableManager异步加载资源,避免阻塞主线程:

// Header File (.h)
#include "Engine/StreamableManager.h"

// 类声明中添加:
public:
    void AsyncLoadTexture();

private:
    FStreamableManager StreamableManager;
    TSharedPtr<FStreamableHandle> AsyncLoadHandle;
// Source File (.cpp)
void AMyActor::AsyncLoadTexture()
{
    if (SoftTexture.IsPending()) // 检查资源是否未加载
    {
        FSoftObjectPath TexturePath = SoftTexture.ToSoftObjectPath();
        AsyncLoadHandle = StreamableManager.RequestAsyncLoad(
            TexturePath,
            FStreamableDelegate::CreateUObject(this, &AMyActor::OnTextureLoaded)
        );
    }
}

void AMyActor::OnTextureLoaded()
{
    UTexture2D* Texture = SoftTexture.Get(); // 获取已加载的资源
    if (Texture)
    {
        UE_LOG(LogTemp, Warning, TEXT("Async texture loaded: %s"), *Texture->GetName());
    }
    AsyncLoadHandle->ReleaseHandle(); // 释放句柄
}

四、蓝图中的TSoftObjectPtr

在蓝图中,可以直接使用Soft Object Reference节点:

  1. 在蓝图中添加一个Soft Object Reference变量(类型选择Texture或其他资源)。
  2. 使用Load Asset节点异步加载资源。
  3. 通过On Loaded事件处理加载完成后的逻辑。

五、注意事项

  • 有效性检查:使用**IsValid()IsPending()**检查资源状态。
  • 引用管理:确保资源在需要时未被垃圾回收(可通过**UPROPERTY()**保持引用)。
  • 路径转换:通过**ToSoftObjectPath()**获取资源路径字符串。
  • 性能优化:避免频繁同步加载,优先使用异步。

六、对比硬引用

  • 硬引用:直接使用UPROPERTY(EditAnywhere) UTexture2D* Texture;,资源会随关卡加载。
  • 软引用:TSoftObjectPtr,仅在需要时加载。

总结

TSoftObjectPtr 是UE5中实现资源动态加载的核心工具之一,合理使用可显著优化内存占用和启动时间。结合AsyncLoadFStreamableManager,能够高效管理大规模资源,特别适合开放世界、动态内容加载等场景。