【问题标题】:Can't compile UE4 Actor with LoadObject() function无法使用 LoadObject() 函数编译 UE4 Actor
【发布时间】:2019-09-01 18:34:47
【问题描述】:

我正在尝试用 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 类文件中包含了这个头文件,但没有结果。

【问题讨论】:

  • 我会尝试回答这个问题,但如果 1)您在问题中包含 RenderActor.h 以及 2)如果您修复了编译器输出,这似乎会更容易一些控制字符,使其难以阅读。

标签: c++ unreal-engine4


【解决方案1】:

有两个编译器错误。

LoadObject 调用没有匹配的函数

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

尝试添加#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"));

附加信息

【讨论】:

  • 但是现在我有一个运行时错误:符号查找错误:~/Unreal Projects/MemRender/Binaries/Linux/libUE4Editor-MemRender-7856.so: undefined symbol: _ZN12ARenderActor16GetTextureByNameEPKDs
  • @starrabb1t 提出一个新问题,我会看看它
  • 我在这里问了一个问题:stackoverflow.com/questions/57817858/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-20
  • 1970-01-01
  • 2021-10-23
  • 1970-01-01
相关资源
最近更新 更多