c++ - 无法使用 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 类文件中,但没有结果。
解决方案
有两个编译器错误。
调用 LoadObject 没有匹配的函数
我认为您收到此错误是因为您没有为您的LoadObject
调用包含模板参数的定义(尽管我不确定,因为您没有包含RenderActor.h
在您的问题中。
尝试添加#include "TextureRenderTarget2D.h"
以解决此问题,因为模板参数的定义必须在您调用LoadObject
.
没有已知的wchar_t *
转换const TCHAR *
该编译器错误的末尾说'const TCHAR *' (aka 'const char16_t *')
,这与wchar_t*
.
当您编写 UE4 代码时,标准做法是让您的函数采用FString
s 或FName
s。您很少看到传递的原始字符指针。如果您确实需要传递一个字符指针,那么您应该使用TCHAR*
与其余的字符串处理函数兼容。
要使您的代码像 UE4 的大多数代码库一样工作,请更改:
UTextureRenderTarget2D* GetTextureByName(wchar_t* name)
至
UTextureRenderTarget2D* GetTextureByName(const TCHAR* name)
然后发生BeginPlay
变化:
UTextureRenderTarget2D* target = GetTextureByName("MyCanvas");
至
UTextureRenderTarget2D* target = GetTextureByName(TEXT("MyCanvas"));
附加信息
推荐阅读
- javascript - 如何使用响应式表单获取完整的下拉对象项?
- c# - 如何在为 HTC VIVE 统一工作时将一个对象粘贴到另一个对象位置
- matlab - 如何从点垫文件中加载变量列表
- php - 函数语法似乎没问题,代码不起作用(functions.php)
- angular - 有谁知道如何在不使用 ngBootstrap 的情况下使用 Bootstrap 创建 Angular 8 DatePicker?
- python - 使用正则表达式的子集熊猫数据框
- java - java的反向猜谜游戏
- r-markdown - R 降价语法
- java - 无法从搜索框中的动态类型中选择值
- reactjs - Webpack 4 的变化