// Copyright 2025 https://yuewu.dev/en All Rights Reserved. #pragma once #include "CoreMinimal.h" #include "GCS_TraceStructLibrary.h" #include "DrawDebugHelpers.h" #include "WorldCollision.h" #include "Kismet/KismetSystemLibrary.h" #include "Subsystems/WorldSubsystem.h" #include "GCS_TraceSubsystem.generated.h" UCLASS() class GENERICCOMBATSYSTEM_API UGCS_TraceSubsystem : public UTickableWorldSubsystem { GENERATED_BODY() public: virtual void Initialize(FSubsystemCollectionBase& Collection) override; virtual void Tick(float DeltaTime) override; virtual bool IsTickable() const override { return true; } virtual TStatId GetStatId() const override { return TStatId(); } FCriticalSection CriticalSection; bool IsValidStateIdx(int32 StateIdx) const; FGCS_TraceState& GetTraceStateAt(int Index); int32 AddTraceState(); void RemoveTraceState(int Idx, FGuid Guid); protected: TArray TraceStates; bool RemovalLock = false; uint32 TickIdx = 0; void RemoveTraceStateAt(int Idx, FGuid Guid); void PreTraceTick(const float DeltaTime); void PostTraceTick(); // 计算所有用于碰撞检测的必须数据。 virtual void PrepareSubTicks(const float DeltaTime); virtual void PerformSubTicks(const float DeltaTime); static void PerformAsyncTrace(const FTransform& StartTransform, const FTransform& EndTransform, const FTransform& AverageTransform, UWorld* World, const FGCS_TraceSweepSetting& TraceSettings, const FCollisionShape& CollisionShape, const FCollisionQueryParams& CollisionParams, const FCollisionResponseParams& CollisionResponseParams, const FCollisionObjectQueryParams& ObjectQueryParams, const FTraceDelegate* InDelegate = nullptr); virtual void HandleTraceResults(const FTraceHandle& InTraceHandle, FTraceDatum& InTraceDatum, int32 TraceStateIdx, uint32 InTickIdx, float InShapeTime); #if ENABLE_DRAW_DEBUG static void DrawDebug(const FVector& Start, const FVector& End, const FQuat& Rot, TArray Hits, const FCollisionShape& CollisionShape, const UWorld* World, const EDrawDebugTrace::Type DrawDebugType, float DrawDebugTime, const FLinearColor& DrawDebugColor, const FLinearColor& DrawDebugHitColor); #endif // 新增:用于批量移除的Pending列表,避免边遍历边修改 TArray> PendingRemovals; };