射線檢測方式 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