C++ 虚幻引擎4:如何将委托传递到异步行跟踪?

C++ 虚幻引擎4:如何将委托传递到异步行跟踪?,c++,unreal-engine4,C++,Unreal Engine4,我正在尝试在unreal中跟踪很多行,目前我正在使用LineTraceSingleByChannel(来自不同的同步线程)进行跟踪。但是,我正在尝试切换到AsyncLineTraceByChannel,在那里我想使用FTraceDelegate在完成时调用函数。我似乎在编译时出错,但我无法找出原因。错误点位于第571行,即FTraceDelegate的闭合支架所在的位置(我在代码中对此进行了标记) 我做错了什么?我该如何解决这个问题 导致错误的代码: FTraceHandle UAirBluep

我正在尝试在unreal中跟踪很多行,目前我正在使用
LineTraceSingleByChannel
(来自不同的同步线程)进行跟踪。但是,我正在尝试切换到
AsyncLineTraceByChannel
,在那里我想使用
FTraceDelegate
在完成时调用函数。我似乎在编译时出错,但我无法找出原因。错误点位于第571行,即FTraceDelegate的闭合支架所在的位置(我在代码中对此进行了标记)

我做错了什么?我该如何解决这个问题

导致错误的代码:

FTraceHandle UAirBlueprintLib::GetObstacleAdvAsync(const AActor* actor, const FVector& start, const FVector& end,
    FHitResult& hit, TArray<AActor*>& ignore_actors, ECollisionChannel collision_channel, bool trace_complex, bool get_material)
{
    bool bIgnoreSelf = false;
    FName traceTag;
    FTraceDelegate traceDelegate = FTraceDelegate::CreateWeakLambda(actor, [](const FTraceHandle& handle, FTraceDatum& data)
    {
        //My logic goes here;
        if (data.OutHits.Num() > 0)
        {
            const FHitResult& Result = data.OutHits[0];
        }
    });

    FCollisionQueryParams trace_params;
    trace_params.bReturnPhysicalMaterial = get_material;
    trace_params.bTraceComplex = trace_complex;
    trace_params.AddIgnoredActors(ignore_actors);

    return actor->GetWorld()->AsyncLineTraceByChannel(EAsyncTraceType::Single,
        start, end,
        collision_channel,
        trace_params,
        FCollisionResponseParams::DefaultResponseParam,
        &traceDelegate);
}
ftraceholder UAirBlueprintLib::GetObstacleAdvAsync(const AActor*actor、const FVector&start、const FVector&end、,
FHitResult&hit,TArray&ignore_actors,ECollisionChannel碰撞_channel,bool trace_complex,bool get_material)
{
bool-bIgnoreSelf=false;
FName-traceTag;
FTraceDelegate traceDelegate=FTraceDelegate::CreateWeakrambda(参与者,[](常量FTraceHandle和handle,FTraceDatum和data)
{
//我的逻辑是这样的;
if(data.OutHits.Num()>0)
{
常数FHitResult&结果=数据输出[0];
}
});
FCollisionQueryParams跟踪参数;
trace_params.bReturnPhysicalMaterial=获取材料;
trace_params.bTraceComplex=trace_complex;
跟踪参数AddIgnoredActors(忽略actors);
返回actor->GetWorld()->AsyncLineTraceByChannel(EAsyncTraceType::Single,
开始,结束,
(港澳台),
跟踪参数,
FCollisionResponseParams::DefaultResponseParam,
&追踪者);
}
错误:

1>c:\<redacted>\unrealengine\engine\source\runtime\core\public\Delegates/DelegateInstancesImpl.h(1008): error C2440: 'return': cannot convert from 'T *' to 'UObject *'
1>          with
1>          [
1>              T=const AActor
1>          ]
1>  c:\<redacted>\unrealengine\engine\source\runtime\core\public\Delegates/DelegateInstancesImpl.h(1008): note: Conversion loses qualifiers
1>  c:\<redacted>\unrealengine\engine\source\runtime\core\public\Delegates/DelegateInstancesImpl.h(1007): note: while compiling class template member function 'UObject *TWeakBaseFunctorDelegateInstance<UserClass,TTypeWrapper<void> (const FTraceHandle &,FTraceDatum &),FunctorType>::GetUObject(void) const'
1>          with
1>          [
1>              UserClass=const AActor,
1>              FunctorType=UAirBlueprintLib::GetObstacleAdvAsync::<lambda_628e4b4604e5c1758c2bd3d199f08ff6>
1>          ]
1>  c:\<redacted>\unrealengine\engine\source\runtime\core\public\Delegates/DelegateInstancesImpl.h(1019): note: see reference to function template instantiation 'UObject *TWeakBaseFunctorDelegateInstance<UserClass,TTypeWrapper<void> (const FTraceHandle &,FTraceDatum &),FunctorType>::GetUObject(void) const' being compiled
1>          with
1>          [
1>              UserClass=const AActor,
1>              FunctorType=UAirBlueprintLib::GetObstacleAdvAsync::<lambda_628e4b4604e5c1758c2bd3d199f08ff6>
1>          ]
1>  c:\<redacted>\unrealengine\engine\source\runtime\core\public\Delegates/DelegateInstancesImpl.h(1084): note: see reference to class template instantiation 'TWeakBaseFunctorDelegateInstance<UserClass,TTypeWrapper<void> (const FTraceHandle &,FTraceDatum &),FunctorType>' being compiled
1>          with
1>          [
1>              UserClass=const AActor,
1>              FunctorType=UAirBlueprintLib::GetObstacleAdvAsync::<lambda_628e4b4604e5c1758c2bd3d199f08ff6>
1>          ]
1>  c:\<redacted>\unrealengine\engine\source\runtime\core\public\Delegates/DelegateSignatureImpl.inl(146): note: see reference to class template instantiation 'TWeakBaseFunctorDelegateInstance<UserClass,void (const FTraceHandle &,FTraceDatum &),UAirBlueprintLib::GetObstacleAdvAsync::<lambda_628e4b4604e5c1758c2bd3d199f08ff6>>' being compiled
1>          with
1>          [
1>              UserClass=const AActor
1>          ]
1>  C:\<redacted>\Documenten\<redacted>\Unreal\Environments\<redacted>\Plugins\<redacted>\Source\AirBlueprintLib.cpp(571): note: see reference to function template instantiation 'TBaseDelegate<void,const FTraceHandle &,FTraceDatum &> TBaseDelegate<TTypeWrapper<void>,const FTraceHandle &,FTraceDatum &>::CreateWeakLambda<const AActor,UAirBlueprintLib::GetObstacleAdvAsync::<lambda_628e4b4604e5c1758c2bd3d199f08ff6>,>(UserClass *,FunctorType &&)' being compiled
1>          with
1>          [
1>              UserClass=const AActor,
1>              FunctorType=UAirBlueprintLib::GetObstacleAdvAsync::<lambda_628e4b4604e5c1758c2bd3d199f08ff6>
1>          ]
1>  C:\<redacted>\Documenten\<redacted>\Unreal\Environments\<redacted>\Plugins\<redacted>\Source\AirBlueprintLib.cpp(564): note: see reference to function template instantiation 'TBaseDelegate<void,const FTraceHandle &,FTraceDatum &> TBaseDelegate<TTypeWrapper<void>,const FTraceHandle &,FTraceDatum &>::CreateWeakLambda<const AActor,UAirBlueprintLib::GetObstacleAdvAsync::<lambda_628e4b4604e5c1758c2bd3d199f08ff6>,>(UserClass *,FunctorType &&)' being compiled
1>          with
1>          [
1>              UserClass=const AActor,
1>              FunctorType=UAirBlueprintLib::GetObstacleAdvAsync::<lambda_628e4b4604e5c1758c2bd3d199f08ff6>
1>          ]
1>C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\IDE\VC\VCTargets\Microsoft.MakeFile.Targets(44,5): error MSB3075: The command "C:\<redacted>\UnrealEngine\Engine\Build\BatchFiles\Build.bat -Target="ShaderCompileWorker Win64 Development" -Target="<redacted> Win64 Development -Project=\"C:\<redacted_path>"" -WaitMutex -FromMsBuild" exited with code 5. Please verify that you have sufficient rights to run this command.
1>c:\\unrealengine\engine\source\runtime\core\public\Delegates/DelegateInstancesImpl.h(1008):错误C2440:“返回”:无法从“T*”转换为“UObject*”
1> 与
1>          [
1> T=常数A
1>          ]
1> c:\\unrealengine\engine\source\runtime\core\public\Delegates/DelegateInstancesImpl.h(1008):注意:转换将丢失限定符
1> c:\\unrealengine\engine\source\runtime\core\public\DelegateInstanceSiml.h(1007):注意:在编译类模板成员函数“UObject*TWeakBaseFunctorDelegateInstance::GetUObject(void)const”时
1> 与
1>          [
1> UserClass=const-AActor,
1> FunctorType=UAirBlueprintLib::GetObstacleAdvAsync::
1>          ]
1> c:\\unrealengine\engine\source\runtime\core\public\DelegateInstancesImpl.h(1019):注意:请参阅正在编译的函数模板实例化“UObject*TWeakBaseFunctorDelegateInstance::GetUObject(void)const”的参考
1> 与
1>          [
1> UserClass=const-AActor,
1> FunctorType=UAirBlueprintLib::GetObstacleAdvAsync::
1>          ]
1> c:\\unrealengine\engine\source\runtime\core\public\DelegateInstanceSiml.h(1084):注意:请参阅正在编译的类模板实例化“TWeakBaseFunctorDelegateInstance”
1> 与
1>          [
1> UserClass=const-AActor,
1> FunctorType=UAirBlueprintLib::GetObstacleAdvAsync::
1>          ]
1> c:\\unrealengine\engine\source\runtime\core\public\Delegates/DelegateSignatureImpl.inl(146):注意:请参阅正在编译的类模板实例化'TWeakBaseFunctorDelegateInstance'的参考
1> 与
1>          [
1> UserClass=const-AActor
1>          ]
1> C:\\Documenten\\Unreal\Environments\\Plugins\\Source\AirBlueprintLib.cpp(571):注意:请参阅正在编译的函数模板实例化“TBaseDelegate TBaseDelegate::CreateWeakLambda(UserClass*,FunctorType&)”的参考
1> 与
1>          [
1> UserClass=const-AActor,
1> FunctorType=UAirBlueprintLib::GetObstacleAdvAsync::
1>          ]
1> C:\\Documenten\\Unreal\Environments\\Plugins\\Source\AirBlueprintLib.cpp(564):注意:请参阅正在编译的函数模板实例化“TBaseDelegate TBaseDelegate::CreateWeakLambda(UserClass*,FunctorType&)”的参考
1> 与
1>          [
1> UserClass=const-AActor,
1> FunctorType=UAirBlueprintLib::GetObstacleAdvAsync::
1>          ]
1> C:\Program Files(x86)\Microsoft Visual Studio\2017\Community\Common7\IDE\VC\VCTargets\Microsoft.MakeFile.Targets(44,5):错误MSB3075:C:\\UnrealEngine\Engine\Build\BatchFiles\Build.bat-Target=“ShaderCompileWorker Win64 Development”-Target=“Win64 Development-Project=\”C:\”“-WaitMutex-FromMsBuild”命令已退出,代码为5。请验证您是否有足够的权限运行此命令。

我换了一种稍微不同的方法来达到目的。按以下方式创建代理对我很有效:

FTraceDelegate traceDelegate;
traceDelegate.BindLambda([](const FTraceHandle& handle, FTraceDatum& data)
    {
        DrawDebugPoint(data.PhysWorld.Get(), data.End, 7.0f, FColor::Purple, false, 0.105);
        if (data.OutHits.Num() > 0)
        {
            const FHitResult& Result = data.OutHits[0];
        }
    });

听起来你好像在某个地方遗漏了一个
#include
,也许
#include“GameFramework/Actor.h”
谢谢你的输入!我尝试了一些不同的包含,但没有成功。不过,转用宾兰达帮了我的忙。哦,好吧,谢谢你让我知道!