首页 > 解决方案 > 无法使用 LoadObject() 函数编译 UE4 Actor

问题描述

我正在尝试在 Unreal Engine C++ 中编写一个从渲染目标获取纹理数据的 Actor。

所以,我有一个带有我的两个自定义方法的类:

#include "RenderActor.h"
#include "Engine.h"
#include <stdio.h>

// Sets default values
ARenderActor::ARenderActor()
{
    // Set this actor to call Tick() every frame.  You can turn this off to improve performance if you don't need it.
    PrimaryActorTick.bCanEverTick = true;
    UE_LOG(LogTemp, Warning, TEXT("Init RenderActor\n"));
}

// Called when the game starts or when spawned
void ARenderActor::BeginPlay()
{
    Super::BeginPlay();
    UE_LOG(LogTemp, Warning, TEXT("BeginPlay RenderActor\n"));

    UTextureRenderTarget2D* target = GetTextureByName("MyCanvas");
}

// Called every frame
void ARenderActor::Tick(float DeltaTime)
{
    Super::Tick(DeltaTime);
}

UTextureRenderTarget2D* GetTextureByName(wchar_t* name)
{
    return LoadObject<UTextureRenderTarget2D>(NULL, name, NULL, LOAD_None, NULL);
}

int ARenderActor::GetTextureData(UTextureRenderTarget2D* TextureRenderTarget ,void* out_ptr,int length)
{
    int sx=TextureRenderTarget->SizeX,sy=TextureRenderTarget->SizeY;
    TArray<FColor> SurfData;
    FRenderTarget *renderTarget = TextureRenderTarget->GameThread_GetRenderTargetResource();
    check((sx*sy*4)<=length);
    renderTarget->ReadPixels(SurfData);
    memcpy(out_ptr,reinterpret_cast<void*>(SurfData.GetData()),sx*sy*4);
    return sx*sy*4;
}

但我得到一个编译错误:

[1/3] Compile RenderActor.cpp
[1m/home/starrabb1t/Documents/Unreal Projects/MemRender/Source/MemRender/RenderActor.cpp:30:9: [0m[0;1;31merror: [0m[1mno matching function for call to 'LoadObject'[0m
        return LoadObject<UTextureRenderTarget2D>(NULL, name, NULL, LOAD_None, NULL);
[0;1;32m               ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
[0m[1m/home/starrabb1t/UnrealEngine/Engine/Source/Runtime/CoreUObject/Public/UObject/UObjectGlobals.h:1345:11: [0m[0;1;30mnote: [0mcandidate function template not viable: no known conversion from 'wchar_t *' to 'const TCHAR *' (aka 'const char16_t *') for 2nd argument[0m
inline T* LoadObject( UObject* Outer, const TCHAR* Name, const TCHAR* Filename=nullptr, uint32 LoadFlags=LOAD_None, UPackageMap* Sandbox=nullptr )
[0;1;32m          ^
[0m1 error generated.

我不明白,怎么了。这里有一个函数 LoadObject():

"Runtime/CoreUObject/Public/UObject/UObjectGlobals.h"

我将此标头包含在 RenderActor.h 类文件中,但没有结果。

标签: c++unreal-engine4

解决方案


有两个编译器错误。

调用 LoadObject 没有匹配的函数

认为您收到此错误是因为您没有为您的LoadObject调用包含模板参数的定义(尽管我不确定,因为您没有包含RenderActor.h在您的问题中。

尝试添加#include "TextureRenderTarget2D.h"以解决此问题,因为模板参数的定义必须在您调用LoadObject.

没有已知的wchar_t *转换const TCHAR *

该编译器错误的末尾说'const TCHAR *' (aka 'const char16_t *'),这与wchar_t*.

当您编写 UE4 代码时,标准做法是让您的函数采用FStrings 或FNames。您很少看到传递的原始字符指针。如果您确实需要传递一个字符指针,那么您应该使用TCHAR*与其余的字符串处理函数兼容。

要使您的代码像 UE4 的大多数代码库一样工作,请更改:

UTextureRenderTarget2D* GetTextureByName(wchar_t* name)

UTextureRenderTarget2D* GetTextureByName(const TCHAR* name)

然后发生BeginPlay变化:

UTextureRenderTarget2D* target = GetTextureByName("MyCanvas");

UTextureRenderTarget2D* target = GetTextureByName(TEXT("MyCanvas"));

附加信息


推荐阅读