From 16fdcb55daf85b2e9cca6f0f43c3eee1b264cb8d Mon Sep 17 00:00:00 2001 From: "j.foucher" Date: Tue, 14 Apr 2026 20:07:22 +0200 Subject: [PATCH] Debounced SplineNetwork rebuild on spline point changes - ScheduleNetworkRebuild() called after AddPoint, RemovePoint, SetAllPointLocations - 0.5s debounce timer avoids redundant rebuilds during rapid editing - AI NPCs now detect and follow splines placed in the editor immediately Co-Authored-By: Claude Opus 4.6 (1M context) --- .../PS_BehaviorEditor_AISpline.cpp | 23 ++++++++++++++++++- .../PS_BehaviorEditor_AISpline.h | 4 ++++ 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/Unreal/Plugins/PS_BehaviorEditor/Source/PS_BehaviorEditor/PS_BehaviorEditor_AISpline.cpp b/Unreal/Plugins/PS_BehaviorEditor/Source/PS_BehaviorEditor/PS_BehaviorEditor_AISpline.cpp index dc44621..0867066 100644 --- a/Unreal/Plugins/PS_BehaviorEditor/Source/PS_BehaviorEditor/PS_BehaviorEditor_AISpline.cpp +++ b/Unreal/Plugins/PS_BehaviorEditor/Source/PS_BehaviorEditor/PS_BehaviorEditor_AISpline.cpp @@ -124,11 +124,30 @@ void APS_BehaviorEditor_AISpline::BeginPlay() // ---- Point manipulation ---- +void APS_BehaviorEditor_AISpline::ScheduleNetworkRebuild() +{ + if (UWorld* World = GetWorld()) + { + World->GetTimerManager().ClearTimer(NetworkRebuildTimer); + World->GetTimerManager().SetTimer(NetworkRebuildTimer, [WeakWorld = TWeakObjectPtr(World)]() + { + if (UWorld* W = WeakWorld.Get()) + { + if (UPS_AI_Behavior_SplineNetwork* Network = W->GetSubsystem()) + { + Network->RebuildNetwork(); + } + } + }, 0.5f, false); + } +} + void APS_BehaviorEditor_AISpline::AddPoint(const FVector& WorldPosition) { SplineComp->AddSplinePoint(WorldPosition, ESplineCoordinateSpace::World, true); PointHandles.Add(CreatePointHandle(WorldPosition)); UpdateVisualization(); + ScheduleNetworkRebuild(); } void APS_BehaviorEditor_AISpline::MovePoint(int32 Index, const FVector& NewWorldPosition) @@ -152,6 +171,7 @@ void APS_BehaviorEditor_AISpline::RemovePoint(int32 Index) PointHandles.RemoveAt(Index); } UpdateVisualization(); + ScheduleNetworkRebuild(); } int32 APS_BehaviorEditor_AISpline::GetNumPoints() const @@ -188,6 +208,7 @@ void APS_BehaviorEditor_AISpline::SetAllPointLocations(const TArray& Po SplineComp->UpdateSpline(); RebuildHandles(); UpdateVisualization(); + ScheduleNetworkRebuild(); } void APS_BehaviorEditor_AISpline::InsertPoint(int32 Index, const FVector& WorldPosition) @@ -196,7 +217,7 @@ void APS_BehaviorEditor_AISpline::InsertPoint(int32 Index, const FVector& WorldP Index = FMath::Clamp(Index, 0, GetNumPoints()); TArray Points = GetAllPointLocations(); Points.Insert(WorldPosition, Index); - SetAllPointLocations(Points); + SetAllPointLocations(Points); // Already calls ScheduleNetworkRebuild } int32 APS_BehaviorEditor_AISpline::FindInsertIndex(const FVector& WorldLocation) const diff --git a/Unreal/Plugins/PS_BehaviorEditor/Source/PS_BehaviorEditor/PS_BehaviorEditor_AISpline.h b/Unreal/Plugins/PS_BehaviorEditor/Source/PS_BehaviorEditor/PS_BehaviorEditor_AISpline.h index 5105ae2..c69c696 100644 --- a/Unreal/Plugins/PS_BehaviorEditor/Source/PS_BehaviorEditor/PS_BehaviorEditor_AISpline.h +++ b/Unreal/Plugins/PS_BehaviorEditor/Source/PS_BehaviorEditor/PS_BehaviorEditor_AISpline.h @@ -110,6 +110,10 @@ private: UPROPERTY() TObjectPtr CenterCubeMat; + /** Schedule a debounced SplineNetwork rebuild. */ + void ScheduleNetworkRebuild(); + FTimerHandle NetworkRebuildTimer; + UPROPERTY(VisibleAnywhere) TObjectPtr SpawnableComp; UPROPERTY(VisibleAnywhere)