第一次提交
This commit is contained in:
@@ -0,0 +1,60 @@
|
||||
// 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;
|
||||
};
|
||||
Reference in New Issue
Block a user