61 lines
2.4 KiB
C++
61 lines
2.4 KiB
C++
// 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;
|
||
};
|