Texture not valid! UE-23902!

private void SetImageFromRenderTarget(UTextureRenderTarget2D RenderTarget)
{
if (PlayerImage == nullptr || !System::IsValid(PlayerImage)) return;
auto Mat = PlayerImage.GetDynamicMaterial();
if (Mat == nullptr || !System::IsValid(Mat)) return;

if (RenderTarget == nullptr || !System::IsValid(RenderTarget))
{ SafeApplyFallback(); return; }

Mat.SetTextureParameterValue(n"PlayerImageTex", RenderTarget);

}我的RT是资产为什么会无效?

Your function does not make sense. It looks like a chatGPT slop.
You need to pass your renderer target as a pointer.
Your PlayerImage also should be a pointer.
There is no System::IsValid function just IsValid

header


#pragma once

#include "CoreMinimal.h"
#include "Blueprint/UserWidget.h"
#include "MyUserWidget.generated.h"

class UImage;
/**
 * 
 */
UCLASS()
class YOUR_API UMyUserWidget : public UUserWidget
{
	GENERATED_BODY()

	UPROPERTY(meta = (BindWidget))
	UImage* PlayerImage;

	UFUNCTION(BlueprintCallable)
	void SetImageFromRenderTarget(UTextureRenderTarget2D* RenderTarget);

	UFUNCTION()
	void SafeApplyFallback();
};

.cpp



#include "MyUserWidget.h"
#include "Engine/TextureRenderTarget2D.h"
#include "Components/Image.h"
#include "Materials/MaterialInstanceDynamic.h"



void UMyUserWidget::SafeApplyFallback()
{
	// do fallback;
}

void UMyUserWidget::SetImageFromRenderTarget(UTextureRenderTarget2D* RenderTarget)
{
	if (PlayerImage == nullptr || !IsValid(PlayerImage)) return;
	UMaterialInstanceDynamic* Mat = PlayerImage->GetDynamicMaterial();
	if (Mat == nullptr || !IsValid(Mat)) return;

	if (RenderTarget == nullptr || !IsValid(RenderTarget))
	{
		SafeApplyFallback(); return;
	}
	Mat->SetTextureParameterValue("PlayerImageTex", RenderTarget);

}

Add in “UMG” Module to the build file

Material

Widget

In game