問題描述
當需要拾取被多層靜態網格體遮擋的對象時,若所有網格體碰撞預設為BlockAll
,需要通過特殊配置實現穿透檢測。
完整實現方案
1. 創建自定義追蹤通道
- 進入 ?項目設置(Project Settings) > 碰撞(Collision)?
- 在 ?追蹤通道(Trace Channels)? 下添加新通道(如
MultiTrace
)
2. 調整靜態網格體碰撞響應
- 將需要穿透的靜態網格體碰撞預設改為 ?Custom
- 設置新建的
MultiTrace
通道響應為 ?Overlap - 其他通道保持 ?Block 維持原有碰撞行為
3. 藍圖實現
項目設置初始化
- 項目設置 > 碰撞 > 添加追蹤通道 “MultiTrace”
靜態網格體配置
- 靜態網格體屬性 > 碰撞預設 > Custom
- MultiTrace 響應設置為 Overlap
- 其他通道保持 Block
射線檢測邏輯
- Line Trace Multi by Channel (Trace Channel: MultiTrace, Start, End)
- 獲取返回的 Out Hits 數組
- 使用數組節點獲取 Last Element
- 處理 Last Hit 中的 Hit Actor
4. C++實現
void YourClass::PerformMultiTrace()
{UWorld* World = GetWorld();if (!World) return;FVector Start = ...; // 射線起點FVector End = ...; // 射線終點TArray<FHitResult> Hits;FCollisionQueryParams Params;Params.bTraceComplex = true;bool bHit = World->LineTraceMultiByChannel(Hits,Start,End,ECC_GameTraceChannel1, // 替換為自定義通道枚舉Params);if (bHit && Hits.Num() > 0){FHitResult& LastHit = Hits.Last();if (AActor* HitActor = LastHit.GetActor()){UE_LOG(LogTemp, Log, TEXT("Hit Actor: %s"), *HitActor->GetName());}}
}
參數說明表
參數/節點 | 作用 |
---|---|
LineTraceMultiByChannel | 穿透多層物體的射線檢測方法 |
bTraceComplex | 啟用三角面層級的精確碰撞檢測 |
ECC_GameTraceChannel1 | 需替換為項目中實際的自定義通道枚舉名 |
Hits.Last() | 按射線發射方向排序的最終命中對象 |