14#include "Engine/CollisionProfile.h"
15#include "DrawDebugHelpers.h"
20 return (SplineComponent!=
nullptr) &&
21 (SplineComponent->GetNumberOfSplinePoints() > 1);
28 auto *
Vehicle = (
Actor->IsPendingKill()? nullptr : Cast<ACarlaWheeledVehicle>(
Actor));
30 Cast<AWheeledVehicleAIController>(
Vehicle->GetController()) :
40 const TArray<USplineComponent *> &Routes,
41 const TArray<float> &Probabilities)
43 check(Routes.Num() > 0);
45 if (Routes.Num() == 1)
51 check((Index >= 0) && (Index < Routes.Num()));
57 : Super(ObjectInitializer)
61 ObjectInitializer.CreateDefaultSubobject<USceneComponent>(
this, TEXT(
"SceneRootComponent"));
62 RootComponent->SetMobility(EComponentMobility::Static);
65 TriggerVolume = CreateDefaultSubobject<UBoxComponent>(TEXT(
"TriggerVolume"));
80 Super::BeginDestroy();
86void ARoutePlanner::PostEditChangeProperty(FPropertyChangedEvent &PropertyChangedEvent)
88 Super::PostEditChangeProperty(PropertyChangedEvent);
89 const auto Size =
Routes.Num();
90 if (PropertyChangedEvent.Property && (Size!=
Probabilities.Num()))
93 for (
auto i = 0; i < Size; ++i)
98 Routes[i] = NewObject<USplineComponent>(
this);
99 Routes[i]->SetupAttachment(RootComponent);
100 Routes[i]->SetHiddenInGame(
true);
101 Routes[i]->SetMobility(EComponentMobility::Static);
102 Routes[i]->RegisterComponent();
113 USplineComponent *NewSpline = NewObject<USplineComponent>(
this);
114 NewSpline->bHiddenInGame =
true;
118 NewSpline->EditorUnselectedSplineSegmentColor = FLinearColor(1.f, 0.15f, 0.15f);
122 NewSpline->SetLocationAtSplinePoint(0, routePoints[0], ESplineCoordinateSpace::World,
true);
123 NewSpline->SetLocationAtSplinePoint(1, routePoints[1], ESplineCoordinateSpace::World,
true);
126 for (
int i = 2; i < routePoints.Num(); ++i)
128 NewSpline->AddSplinePoint(routePoints[i], ESplineCoordinateSpace::World,
true);
146 if (!Controller.IsPendingKill() && (Controller.
GetRandomEngine()!=
nullptr))
151 TArray<FVector> WayPoints;
152 const auto Size = Route->GetNumberOfSplinePoints();
155 WayPoints.Reserve(Size);
156 for (
auto i = 1; i < Size; ++i)
158 WayPoints.Add(Route->GetLocationAtSplinePoint(i, ESplineCoordinateSpace::World));
166 UE_LOG(LogCarla, Error, TEXT(
"ARoutePlanner '%s' has a route with zero way-points."), *GetName());
180 UE_LOG(LogCarla, Warning, TEXT(
"ARoutePlanner '%s' has no route assigned."), *GetName());
184 for (
auto &&Route :
Routes)
188 UE_LOG(LogCarla, Error, TEXT(
"ARoutePlanner '%s' has a route with zero way-points."), *GetName());
216 Super::EndPlay(EndPlayReason);
230 if (Controller!=
nullptr)
241 for (
int i = 0, lenRoutes =
Routes.Num(); i < lenRoutes; ++i)
243 for (
int j = 0, lenNumPoints =
Routes[i]->GetNumberOfSplinePoints() - 1; j < lenNumPoints; ++j)
245 const FVector p0 =
Routes[i]->GetLocationAtSplinePoint(j + 0, ESplineCoordinateSpace::World);
246 const FVector p1 =
Routes[i]->GetLocationAtSplinePoint(j + 1, ESplineCoordinateSpace::World);
248 static const float MinThickness = 3.f;
249 static const float MaxThickness = 15.f;
251 const float Dist = (float) j / (
float) lenNumPoints;
252 const float OneMinusDist = 1.f - Dist;
253 const float Thickness = OneMinusDist * MaxThickness + MinThickness;
259 GetWorld(), p0, p1, FColor(0, 0, 255 * OneMinusDist),
260 true, -1.f, 0, Thickness);
266 GetWorld(), p0, p1, FColor(0, 255 * OneMinusDist, 0),
267 true, -1.f, 0, Thickness);
UE_LOG(LogCarla, Log, TEXT("UActorDispatcher::Destroying actor: '%s' %x"), *Id, Actor)
TSharedPtr< const FActorInfo > carla::rpc::ActorState UWorld Actor
static AWheeledVehicleAIController * GetVehicleController(AActor *Actor)
static bool IsSplineValid(const USplineComponent *SplineComponent)
static const USplineComponent * PickARoute(URandomEngine &RandomEngine, const TArray< USplineComponent * > &Routes, const TArray< float > &Probabilities)
virtual void BeginPlay() override
virtual void BeginDestroy() override
void AddRoute(float probability, const TArray< FVector > &routePoints)
UBoxComponent * TriggerVolume
ARoutePlanner(const FObjectInitializer &ObjectInitializer)
void AssignRandomRoute(AWheeledVehicleAIController &Controller) const
void OnTriggerBeginOverlap(UPrimitiveComponent *OverlappedComp, AActor *OtherActor, UPrimitiveComponent *OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult &SweepResult)
TArray< USplineComponent * > Routes
TArray< float > Probabilities
virtual void EndPlay(EEndPlayReason::Type EndPlayReason) override
URandomEngine * GetRandomEngine()
void SetFixedRoute(const TArray< FVector > &Locations, bool bOverwriteCurrent=true)
设置启用 Autopilot 时要遵循的固定路线。
int32 GetIntWithWeight(const TArray< float > &Weights)