Ue4_C++射线检测Trace Channel
射线检测方式 Object Channels (对象通道)/ Trace Channels(跟踪通道)
包括 Object /Trace Channel 二者一共可以自定义通道18个
一. 根据Object type进行类型检测
UKismetSystemLibrary::LineTraceSingleForObjects 对应ObjectType类型检测
const UObject* WorldContextObject, const FVector Start, const FVector End, const TArray<TEnumAsByte<EObjectTypeQuery> > & ObjectTypes ,..)
const TArray<TEnumAsByte<EObjectTypeQuery> > & ObjectTypes 可见参数类型为 EObjectTypeQuery
第一种参数: EObjectTypeQuery -
UENUM(BlueprintType)
enum EObjectTypeQuery
{
ObjectTypeQuery1 UMETA(Hidden),
ObjectTypeQuery2 UMETA(Hidden),
ObjectTypeQuery3 UMETA(Hidden)
}
TArray<TEnumAsByte<EObjectTypeQuery> > ObjectArr;
ObjectArr.Add(EObjectTypeQuery::ObjectTypeQuery1);
UKismetSystemLibrary::LineTraceSingleForObjects(../ObjectArr/..)
//检测为WorldStatic
WorldStatic 对应 ObjectTypeQuery1 / WolrdDynamic 对应 ObjectTypeQuery2
第二种参数:UEngineTypes::ConvertToObjectType
TArray<TEnumAsByte<EObjectTypeQuery> > ObjectArr;
ObjectArr.Add(UEngineTypes::ConvertToObjectType(ECC_PhysicsBody));
二.根据Trace Channel 进行检测
UKismetSystemLibrary::LineTraceSingle 对通道进行检测
bool UKismetSystemLibrary::LineTraceSingle(const UObject* WorldContextObject, const FVector Start, const FVector End, ETraceTypeQuery TraceChannel, bool bTraceComplex, const TArray<AActor*>& ActorsToIgnore, EDrawDebugTrace::Type DrawDebugType, FHitResult& OutHit, bool bIgnoreSelf, FLinearColor TraceColor, FLinearColor TraceHitColor, float DrawTime)
{
ECollisionChannel CollisionChannel = UEngineTypes::ConvertToCollisionChannel(TraceChannel);
static const FName LineTraceSingleName(TEXT("LineTraceSingle"));
FCollisionQueryParams Params = ConfigureCollisionParams(LineTraceSingleName, bTraceComplex, ActorsToIgnore, bIgnoreSelf, WorldContextObject);
UWorld* World = GEngine->GetWorldFromContextObject(WorldContextObject, EGetWorldErrorMode::LogAndReturnNull);
bool const bHit = World ? World->LineTraceSingleByChannel(OutHit, Start, End, CollisionChannel, Params) : false;
UEngineTypes::ConvertToCollisionChannel 实现过程
ECollisionChannel UEngineTypes::ConvertToCollisionChannel(ETraceTypeQuery TraceType)
{
return UCollisionProfile::Get()->ConvertToCollisionChannel(true, (int32)TraceType);
}
ECollisionChannel UEngineTypes::ConvertToCollisionChannel(EObjectTypeQuery ObjectType)
{
return UCollisionProfile::Get()->ConvertToCollisionChannel(false, (int32)ObjectType);
}
UCollisionProfile::Get()->ConvertToCollisionChannel 实现过程
ECollisionChannel UCollisionProfile::ConvertToCollisionChannel(bool TraceType, int32 Index) const
{
if (TraceType)
{
if ( TraceTypeMapping.IsValidIndex(Index) )
{
return TraceTypeMapping[Index];
}
}
else
{
if ( ObjectTypeMapping.IsValidIndex(Index) )
{
return ObjectTypeMapping[Index];
}
}
// invalid
return ECC_MAX;
}
可以看出 ETraceTypeQuery 为需要传递参数的枚举类型
一. 直接传递
根据当前的Trace Channel 顺序
如图所示 Visibility 为 TraceTypeQuery1 / Camera 为 TraceTypeQuery2 / Test_Channel 为 TraceTypeQuery3
二.通过 UEngineTypes::ConvertToTraceType 转换
ETraceTypeQuery UEngineTypes::ConvertToTraceType(ECollisionChannel CollisionChannel) { return UCollisionProfile::Get()->ConvertToTraceType(CollisionChannel); }
接受参数为 ECollisionChannel
UENUM(BlueprintType) enum ECollisionChannel { ECC_WorldStatic UMETA(DisplayName="WorldStatic"), ECC_WorldDynamic UMETA(DisplayName="WorldDynamic"), ECC_Pawn UMETA(DisplayName="Pawn"), ECC_Visibility UMETA(DisplayName="Visibility" , TraceQuery="1"), ECC_Camera UMETA(DisplayName="Camera" , TraceQuery="1"), ECC_PhysicsBody UMETA(DisplayName="PhysicsBody"), ECC_Vehicle UMETA(DisplayName="Vehicle"), ECC_Destructible UMETA(DisplayName="Destructible"), /** Reserved for gizmo collision */ ECC_EngineTraceChannel1 UMETA(Hidden), ECC_EngineTraceChannel2 UMETA(Hidden), ECC_EngineTraceChannel3 UMETA(Hidden), ECC_EngineTraceChannel4 UMETA(Hidden), ECC_EngineTraceChannel5 UMETA(Hidden), ECC_EngineTraceChannel6 UMETA(Hidden) }
可以看出 ECC_EngineTraceChannel1 - 18 为可以自定义通道,根据官方文档 Trace Channel 与 Object Channel 共有18 个可自定义通道类型
当新创建新的 Trace Channel / Obejct Channel 时
图3-1-1
进行 EObjectTypeQuery UEngineTypes::ConvertToObjectType(ECollisionChannel CollisionChannel) / ETraceTypeQuery UEngineTypes::ConvertToTraceType(ECollisionChannel CollisionChannel)
传入ECollisionChannel 进行object type /trace channel 转换
图3-1-1
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具