Created Friction Layer Actor

This commit is contained in:
Manish 2019-04-15 18:14:16 +02:00
parent 6b65e5833a
commit 2d352612e9
4 changed files with 156 additions and 0 deletions

View File

@ -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>(

View File

@ -172,6 +172,9 @@ public:
SetHandbrakeInput(false);
}
TArray<float> GetWheelsFrictionScale();
void SetWheelsFrictionScale(TArray<float> &WheelsFrictionScale);
/// @}
// ===========================================================================
/// @name Overriden from AActor

View File

@ -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);
}

View File

@ -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;
};