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) <noreply@anthropic.com>
This commit is contained in:
2026-04-14 20:07:22 +02:00
parent 1f11b79222
commit 16fdcb55da
2 changed files with 26 additions and 1 deletions

View File

@@ -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<UWorld>(World)]()
{
if (UWorld* W = WeakWorld.Get())
{
if (UPS_AI_Behavior_SplineNetwork* Network = W->GetSubsystem<UPS_AI_Behavior_SplineNetwork>())
{
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<FVector>& 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<FVector> Points = GetAllPointLocations();
Points.Insert(WorldPosition, Index);
SetAllPointLocations(Points);
SetAllPointLocations(Points); // Already calls ScheduleNetworkRebuild
}
int32 APS_BehaviorEditor_AISpline::FindInsertIndex(const FVector& WorldLocation) const

View File

@@ -110,6 +110,10 @@ private:
UPROPERTY()
TObjectPtr<UMaterialInstanceDynamic> CenterCubeMat;
/** Schedule a debounced SplineNetwork rebuild. */
void ScheduleNetworkRebuild();
FTimerHandle NetworkRebuildTimer;
UPROPERTY(VisibleAnywhere)
TObjectPtr<UPS_Editor_SpawnableComponent> SpawnableComp;
UPROPERTY(VisibleAnywhere)