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 

 

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM