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 

 

 

posted on 2022-04-06 22:12  Animer  阅读(1540)  评论(0编辑  收藏  举报