通过资源管理器创建的渲染目标
#include "RenderTargetSetterActor.h" #include "AssetRegistry/AssetRegistryModule.h" #include "Engine/AssetManager.h" ARenderTargetSetterActor::ARenderTargetSetterActor() { PrimaryActorTick.bCanEverTick = false; SceneCaptureComponent = CreateDefaultSubobject<USceneCaptureComponent2D>(TEXT("SceneCaptureComponent")); SceneCaptureComponent->SetupAttachment(RootComponent); } void ARenderTargetSetterActor::BeginPlay() { Super::BeginPlay(); UTextureRenderTarget2D* RenderTarget = LoadRenderTarget(); if (RenderTarget && SceneCaptureComponent) { SceneCaptureComponent->TextureTarget = RenderTarget; } } UTextureRenderTarget2D* ARenderTargetSetterActor::LoadRenderTarget() { if (RenderTargetAssetRef.IsValid()) { UObject* Asset = UAssetManager::GetStreamableManager().LoadSynchronous(RenderTargetAssetRef); return Cast<UTextureRenderTarget2D>(Asset); } return nullptr; }
#pragma once #include "CoreMinimal.h" #include "GameFramework/Actor.h" #include "Engine/TextureRenderTarget2D.h" #include "Components/SceneCaptureComponent2D.h" #include "RenderTargetSetterActor.generated.h" UCLASS() class YOURPROJECT_API ARenderTargetSetterActor : public AActor { GENERATED_BODY() public: ARenderTargetSetterActor(); protected: virtual void BeginPlay() override; private: UPROPERTY(EditAnywhere, Category = "Render Target") FStringAssetReference RenderTargetAssetRef; UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Components") USceneCaptureComponent2D* SceneCaptureComponent; UTextureRenderTarget2D* LoadRenderTarget(); };
那么每次通过LoadRenderTarget()得到的渲染目标是不是同一个呢?
每次调用LoadRenderTarget()函数,如果RenderTargetAssetRef不变,并且加载过程没有错误,那么得到的是同一个渲染目标实例。
LoadRenderTarget()函数通过UAssetManager根据RenderTargetAssetRef来加载资产。只要RenderTargetAssetRef所引用的渲染目标资产路径不变,UAssetManager会返回相同的UTextureRenderTarget2D实例。因为UAssetManager会缓存已经加载的资产,当再次请求加载相同路径的资产时,它会直接从缓存中返回已加载的实例,而不会重新创建一个新的实例。
不过,如果在调用LoadRenderTarget()函数之前,RenderTargetAssetRef被修改为引用另一个不同的渲染目标资产,那么将会加载并返回一个不同的渲染目标实例。此外,如果资产在加载过程中出现错误,例如资产路径无效或资产被删除等情况,函数将返回nullptr。