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