Files
PHY/Plugins/GCS/Source/GenericCombatSystem/Public/Collision/GCS_TraceSubsystem.h
2026-03-03 01:23:02 +08:00

61 lines
2.4 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// 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<FGCS_TraceState> 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<FHitResult> Hits, const FCollisionShape& CollisionShape, const UWorld* World,
const EDrawDebugTrace::Type DrawDebugType, float DrawDebugTime, const FLinearColor& DrawDebugColor, const FLinearColor& DrawDebugHitColor);
#endif
// 新增用于批量移除的Pending列表避免边遍历边修改
TArray<TPair<int32, FGuid>> PendingRemovals;
};