16#include "EngineUtils.h"
17#include "GameFramework/Pawn.h"
18#include "WheeledVehicleMovementComponent.h"
28 static FName TraceTag = FName(TEXT(
"VehicleTrace"));
29 FCollisionQueryParams CollisionParams(TraceTag,
true);
30 CollisionParams.AddIgnoredActor(&
Actor);
33 const bool Success =
Actor.GetWorld()->LineTraceSingleByObjectType(
37 FCollisionObjectQueryParams(FCollisionObjectQueryParams::AllDynamicObjects),
45 return Success && OutHit.bBlockingHit;
52 const FVector &Direction)
55 const auto ForwardVector =
Vehicle.GetVehicleOrientation();
56 const auto VehicleBounds =
Vehicle.GetVehicleBoundingBoxExtent();
59 FVector NormDirection = Direction.GetSafeNormal();
62 const float Distance = std::max(50.0f, Speed * Speed);
65 const FVector StartCenter =
Vehicle.GetActorLocation() +
66 (ForwardVector * (250.0f + VehicleBounds.X / 2.0f)) + FVector(0.0f, 0.0f, 50.0f);
67 const FVector EndCenter = StartCenter + NormDirection * (Distance + VehicleBounds.X / 2.0f);
69 const FVector StartRight = StartCenter +
70 (FVector(ForwardVector.Y, -ForwardVector.X, ForwardVector.Z) * 100.0f);
71 const FVector EndRight = StartRight + NormDirection * (Distance + VehicleBounds.X / 2.0f);
73 const FVector StartLeft = StartCenter +
74 (FVector(-ForwardVector.Y, ForwardVector.X, ForwardVector.Z) * 100.0f);
75 const FVector EndLeft = StartLeft + NormDirection * (Distance + VehicleBounds.X / 2.0f);
88 std::queue<T> EmptyQueue;
89 Queue.swap(EmptyQueue);
98 : Super(ObjectInitializer)
100 RandomEngine = CreateDefaultSubobject<URandomEngine>(TEXT(
"RandomEngine"));
104 PrimaryActorTick.bCanEverTick =
true;
105 PrimaryActorTick.TickGroup = TG_PrePhysics;
118 Super::OnPossess(aPawn);
123 UE_LOG(LogCarla, Error, TEXT(
"Controller already possessing a vehicle!"));
126 Vehicle = Cast<ACarlaWheeledVehicle>(aPawn);
135 TActorIterator<ACityMapGenerator> It(GetWorld());
136 RoadMap = (It ? It->GetRoadMap() :
nullptr);
143 Super::OnUnPossess();
152 Super::Tick(DeltaTime);
189 ECarlaWheeledVehicleState::FreeDriving :
190 ECarlaWheeledVehicleState::AutopilotOff);
193 TrafficLightState = ETrafficLightState::Green;
202 const TArray<FVector> &Locations,
203 const bool bOverwriteCurrent)
205 if (bOverwriteCurrent)
209 for (
auto &Location : Locations)
UE_LOG(LogCarla, Log, TEXT("UActorDispatcher::Destroying actor: '%s' %x"), *Id, Actor)
TSharedPtr< const FActorInfo > carla::rpc::ActorState UWorld Actor
static bool RayCast(const AActor &Actor, const FVector &Start, const FVector &End)
static void ClearQueue(std::queue< T > &Queue)
static bool IsThereAnObstacleAhead(const ACarlaWheeledVehicle &Vehicle, const float Speed, const FVector &Direction)
Base class for CARLA wheeled vehicles.
void SetAIVehicleState(ECarlaWheeledVehicleState InState)
void SetThrottleInput(float Value)
void SetReverse(bool Value)
float GetMaximumSteerAngle() const
Get the maximum angle at which the front wheel can steer.
void SetBrakeInput(float Value)
void SetSteeringInput(float Value)
void FlushVehicleControl()
void ApplyVehicleControl(const FVehicleControl &Control, EVehicleInputPriority Priority)
void SetHandbrakeInput(bool Value)
void ConfigureAutopilot(const bool Enable, const bool KeepState=false)
void OnUnPossess() override
AWheeledVehicleAIController(const FObjectInitializer &ObjectInitializer)
URandomEngine * RandomEngine
bool IsPossessingAVehicle() const
void OnPossess(APawn *aPawn) override
void SetFixedRoute(const TArray< FVector > &Locations, bool bOverwriteCurrent=true)
设置启用 Autopilot 时要遵循的固定路线。
void Tick(float DeltaTime) override
~AWheeledVehicleAIController()
std::queue< FVector > TargetLocations
ACarlaWheeledVehicle * Vehicle
void Seed(int32 InSeed)
播种随机引擎/初始化随机数生成器
static int32 GenerateRandomSeed()
生成一个非确定性随机数种子。