Created Friction Layer Actor
This commit is contained in:
parent
6b65e5833a
commit
2d352612e9
|
@ -159,6 +159,25 @@ void ACarlaWheeledVehicle::SetHandbrakeInput(const bool Value)
|
|||
ApplyVehicleControl(Control, EVehicleInputPriority::User);
|
||||
}
|
||||
|
||||
TArray<float> ACarlaWheeledVehicle::GetWheelsFrictionScale() {
|
||||
UWheeledVehicleMovementComponent4W *Vehicle4W = CastChecked<UWheeledVehicleMovementComponent4W>(GetVehicleMovement());
|
||||
|
||||
TArray<float> WheelsFrictionScale;
|
||||
for (auto& Wheel : Vehicle4W->Wheels)
|
||||
{
|
||||
WheelsFrictionScale.Add(Wheel->TireConfig->GetFrictionScale());
|
||||
}
|
||||
return WheelsFrictionScale;
|
||||
}
|
||||
|
||||
void ACarlaWheeledVehicle::SetWheelsFrictionScale(TArray<float> &WheelsFrictionScale) {
|
||||
UWheeledVehicleMovementComponent4W *Vehicle4W = CastChecked<UWheeledVehicleMovementComponent4W>(GetVehicleMovement());
|
||||
for (int32 i = 0; i < Vehicle4W->Wheels.Num(); ++i)
|
||||
{
|
||||
Vehicle4W->Wheels[i]->TireConfig->SetFrictionScale(WheelsFrictionScale[i]);
|
||||
}
|
||||
}
|
||||
|
||||
FVehiclePhysicsControl ACarlaWheeledVehicle::GetVehiclePhysicsControl()
|
||||
{
|
||||
UWheeledVehicleMovementComponent4W *Vehicle4W = CastChecked<UWheeledVehicleMovementComponent4W>(
|
||||
|
|
|
@ -172,6 +172,9 @@ public:
|
|||
SetHandbrakeInput(false);
|
||||
}
|
||||
|
||||
TArray<float> GetWheelsFrictionScale();
|
||||
|
||||
void SetWheelsFrictionScale(TArray<float> &WheelsFrictionScale);
|
||||
/// @}
|
||||
// ===========================================================================
|
||||
/// @name Overriden from AActor
|
||||
|
|
|
@ -0,0 +1,84 @@
|
|||
// Copyright (c) 2017 Computer Vision Center (CVC) at the Universitat Autonoma de Barcelona (UAB). This work is licensed under the terms of the MIT license. For a copy, see <https://opensource.org/licenses/MIT>.
|
||||
|
||||
#include "Carla.h"
|
||||
#include "FrictionLayer.h"
|
||||
#include "CarlaWheeledVehicle.h"
|
||||
|
||||
AFrictionLayer::AFrictionLayer(const FObjectInitializer &ObjectInitializer)
|
||||
: Super(ObjectInitializer)
|
||||
{
|
||||
RootComponent = ObjectInitializer.CreateDefaultSubobject<USceneComponent>(this,TEXT("SceneRootComponent"));
|
||||
RootComponent->SetMobility(EComponentMobility::Static);
|
||||
TriggerVolume = CreateDefaultSubobject<UBoxComponent>(TEXT("TriggerVolume"));
|
||||
TriggerVolume->SetupAttachment(RootComponent);
|
||||
TriggerVolume->SetHiddenInGame(true);
|
||||
TriggerVolume->SetMobility(EComponentMobility::Static);
|
||||
TriggerVolume->SetCollisionProfileName(FName("OverlapAll"));
|
||||
TriggerVolume->SetGenerateOverlapEvents(true);
|
||||
}
|
||||
|
||||
void AFrictionLayer::Init() {
|
||||
// Register delegate on begin overlap.
|
||||
if (!TriggerVolume->OnComponentBeginOverlap.IsAlreadyBound(this, &AFrictionLayer::OnTriggerBeginOverlap))
|
||||
{
|
||||
TriggerVolume->OnComponentBeginOverlap.AddDynamic(this, &AFrictionLayer::OnTriggerBeginOverlap);
|
||||
}
|
||||
|
||||
// Register delegate on end overlap.
|
||||
if (!TriggerVolume->OnComponentEndOverlap.IsAlreadyBound(this, &AFrictionLayer::OnTriggerEndOverlap))
|
||||
{
|
||||
TriggerVolume->OnComponentEndOverlap.AddDynamic(this, &AFrictionLayer::OnTriggerEndOverlap);
|
||||
}
|
||||
}
|
||||
|
||||
void AFrictionLayer::OnTriggerBeginOverlap(
|
||||
UPrimitiveComponent * /*OverlappedComp*/,
|
||||
AActor *OtherActor,
|
||||
UPrimitiveComponent * /*OtherComp*/,
|
||||
int32 /*OtherBodyIndex*/,
|
||||
bool /*bFromSweep*/,
|
||||
const FHitResult & /*SweepResult*/)
|
||||
{
|
||||
ACarlaWheeledVehicle* Vehicle = CastChecked<ACarlaWheeledVehicle>(OtherActor);
|
||||
if (Vehicle) {
|
||||
TArray<float> WheelsFrictionScale = Vehicle->GetWheelsFrictionScale();
|
||||
for (auto& FrictionScale : WheelsFrictionScale) {
|
||||
FrictionScale = 0.0f;
|
||||
}
|
||||
|
||||
Vehicle->SetWheelsFrictionScale(WheelsFrictionScale);
|
||||
}
|
||||
}
|
||||
|
||||
void AFrictionLayer::OnTriggerEndOverlap(
|
||||
UPrimitiveComponent * /*OverlappedComp*/,
|
||||
AActor *OtherActor,
|
||||
UPrimitiveComponent * /*OtherComp*/,
|
||||
int32 /*OtherBodyIndex*/)
|
||||
{
|
||||
ACarlaWheeledVehicle* Vehicle = CastChecked<ACarlaWheeledVehicle>(OtherActor);
|
||||
if (Vehicle) {
|
||||
TArray<float> WheelsFrictionScale = Vehicle->GetWheelsFrictionScale();
|
||||
for (auto& FrictionScale : WheelsFrictionScale) {
|
||||
FrictionScale = 3.5f;
|
||||
}
|
||||
|
||||
Vehicle->SetWheelsFrictionScale(WheelsFrictionScale);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Called when the game starts or when spawned
|
||||
void AFrictionLayer::BeginPlay()
|
||||
{
|
||||
Super::BeginPlay();
|
||||
Init();
|
||||
}
|
||||
|
||||
// Called every frame
|
||||
void AFrictionLayer::Tick(float DeltaTime)
|
||||
{
|
||||
Super::Tick(DeltaTime);
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,50 @@
|
|||
// Copyright (c) 2017 Computer Vision Center (CVC) at the Universitat Autonoma de Barcelona (UAB). This work is licensed under the terms of the MIT license. For a copy, see <https://opensource.org/licenses/MIT>.
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "GameFramework/Actor.h"
|
||||
|
||||
#include "FrictionLayer.generated.h"
|
||||
|
||||
UCLASS()
|
||||
class CARLA_API AFrictionLayer : public AActor
|
||||
{
|
||||
GENERATED_BODY()
|
||||
|
||||
private:
|
||||
void Init();
|
||||
|
||||
public:
|
||||
|
||||
AFrictionLayer(const FObjectInitializer &ObjectInitializer);
|
||||
|
||||
UFUNCTION()
|
||||
void OnTriggerBeginOverlap(
|
||||
UPrimitiveComponent *OverlappedComp,
|
||||
AActor *OtherActor,
|
||||
UPrimitiveComponent *OtherComp,
|
||||
int32 OtherBodyIndex,
|
||||
bool bFromSweep,
|
||||
const FHitResult &SweepResult);
|
||||
|
||||
UFUNCTION()
|
||||
void OnTriggerEndOverlap(
|
||||
UPrimitiveComponent *OverlappedComp,
|
||||
AActor *OtherActor,
|
||||
UPrimitiveComponent *OtherComp,
|
||||
int32 OtherBodyIndex);
|
||||
|
||||
protected:
|
||||
|
||||
virtual void BeginPlay() override;
|
||||
|
||||
public:
|
||||
|
||||
UPROPERTY(EditAnywhere)
|
||||
UBoxComponent *TriggerVolume;
|
||||
|
||||
virtual void Tick(float DeltaTime) override;
|
||||
|
||||
|
||||
|
||||
};
|
Loading…
Reference in New Issue