void AVehiclePawn::SpawnNewWheelEffect(int WheelIndex) { DustPSC[WheelIndex] = NewObject<UParticleSystemComponent>(this); DustPSC[WheelIndex]->bAutoActivate = true; DustPSC[WheelIndex]->bAutoDestroy = false; DustPSC[WheelIndex]->RegisterComponentWithWorld(GetWorld()); DustPSC[WheelIndex]->AttachTo(GetMesh(), GetVehicleMovement()->WheelSetups[WheelIndex].BoneName); }
void AUnsealed4x4Pawn::UpdateHUDStrings() { float KPH = FMath::Abs(GetVehicleMovement()->GetForwardSpeed()) * 0.036f; int32 KPH_int = FMath::FloorToInt(KPH); // Using FText because this is display text that should be localizable SpeedDisplayString = FText::Format(LOCTEXT("SpeedFormat", "{0} km/h"), FText::AsNumber(KPH_int)); if (bInReverseGear == true) { GearDisplayString = FText(LOCTEXT("ReverseGear", "R")); } else { int32 Gear = GetVehicleMovement()->GetCurrentGear(); GearDisplayString = (Gear == 0) ? LOCTEXT("N", "N") : FText::AsNumber(Gear); } }
void AUnsealed4x4Pawn::Tick(float Delta) { // Setup the flag to say we are in reverse gear bInReverseGear = GetVehicleMovement()->GetCurrentGear() < 0; /*if (isAutoAccel && GetVehicleMovement()->IsMovingOnGround()) { AutoAcceleration(); }*/ // Update phsyics material UpdatePhysicsMaterial(); // Update the strings used in the hud (incar and onscreen) UpdateHUDStrings(); // Set the string in the incar hud SetupInCarHUD(); // Pass the engine RPM to the sound component float RPMToAudioScale = 2500.0f / GetVehicleMovement()->GetEngineMaxRotationSpeed(); EngineSoundComponent->SetFloatParameter(EngineAudioRPM, GetVehicleMovement()->GetEngineRotationSpeed()*RPMToAudioScale); }
void ARacerPawn::Tick(float Delta) { // Setup the flag to say we are in reverse gear bInReverseGear = GetVehicleMovement()->GetCurrentGear() < 0; // Update the strings used in the hud (incar and onscreen) UpdateHUDStrings(); // Set the string in the incar hud SetupInCarHUD(); #ifdef HMD_INTGERATION if ((GEngine->HMDDevice.IsValid() == false) || ((GEngine->HMDDevice.IsValid() == true ) && ( (GEngine->HMDDevice->IsHeadTrackingAllowed() == false) || (GEngine->IsStereoscopic3D() == false)))) { if ( (InputComponent) && (bInCarCameraActive == true )) { FRotator HeadRotation = InternalCamera->RelativeRotation; HeadRotation.Pitch += InputComponent->GetAxisValue(LookUpBinding); HeadRotation.Yaw += InputComponent->GetAxisValue(LookRightBinding); InternalCamera->RelativeRotation = HeadRotation; } } #endif // HMD_INTGERATION }
AUnsealed4x4Pawn::AUnsealed4x4Pawn(const FObjectInitializer& ObjectInitializer) : Super(ObjectInitializer) { // Car mesh //static ConstructorHelpers::FObjectFinder<USkeletalMesh> CarMesh(TEXT("/Game/VehicleAdv/Vehicle/Vehicle_SkelMesh.Vehicle_SkelMesh")); //default one static ConstructorHelpers::FObjectFinder<USkeletalMesh> CarMesh(TEXT("/Game/Offroad4x4Content/Vehicle/Amorok_01_buggy.Amorok_01_buggy")); // dummy by tim GetMesh()->SetSkeletalMesh(CarMesh.Object); //static ConstructorHelpers::FClassFinder<UObject> AnimBPClass(TEXT("/Game/VehicleAdv/Vehicle/VehicleAnimationBlueprint")); static ConstructorHelpers::FClassFinder<UObject> AnimBPClass(TEXT("/Game/Offroad4x4Content/Vehicle/Amorok_Anim")); GetMesh()->SetAnimationMode(EAnimationMode::AnimationBlueprint); GetMesh()->SetAnimInstanceClass(AnimBPClass.Class); // Setup friction materials static ConstructorHelpers::FObjectFinder<UPhysicalMaterial> SlipperyMat(TEXT("/Game/VehicleAdv/PhysicsMaterials/Slippery.Slippery")); SlipperyMaterial = SlipperyMat.Object; static ConstructorHelpers::FObjectFinder<UPhysicalMaterial> NonSlipperyMat(TEXT("/Game/VehicleAdv/PhysicsMaterials/NonSlippery.NonSlippery")); NonSlipperyMaterial = NonSlipperyMat.Object; UWheeledVehicleMovementComponent4W* Vehicle4W = CastChecked<UWheeledVehicleMovementComponent4W>(GetVehicleMovement()); check(Vehicle4W->WheelSetups.Num() == 4); // Wheels/Tyres // Setup the wheels Vehicle4W->WheelSetups[0].WheelClass = UUnsealed4x4WheelFront::StaticClass(); Vehicle4W->WheelSetups[0].BoneName = FName("F_L_wheelJNT"); Vehicle4W->WheelSetups[0].AdditionalOffset = FVector(0.f, -8.f, 0.f); Vehicle4W->WheelSetups[1].WheelClass = UUnsealed4x4WheelFront::StaticClass(); Vehicle4W->WheelSetups[1].BoneName = FName("F_R_wheelJNT"); Vehicle4W->WheelSetups[1].AdditionalOffset = FVector(0.f, 8.f, 0.f); Vehicle4W->WheelSetups[2].WheelClass = UUnsealed4x4WheelRear::StaticClass(); Vehicle4W->WheelSetups[2].BoneName = FName("B_L_wheelJNT"); Vehicle4W->WheelSetups[2].AdditionalOffset = FVector(0.f, -8.f, 0.f); Vehicle4W->WheelSetups[3].WheelClass = UUnsealed4x4WheelRear::StaticClass(); Vehicle4W->WheelSetups[3].BoneName = FName("B_R_wheelJNT"); Vehicle4W->WheelSetups[3].AdditionalOffset = FVector(0.f, 8.f, 0.f); // Adjust the tire loading Vehicle4W->MinNormalizedTireLoad = 0.0f; Vehicle4W->MinNormalizedTireLoadFiltered = 0.2f; Vehicle4W->MaxNormalizedTireLoad = 2.0f; Vehicle4W->MaxNormalizedTireLoadFiltered = 2.0f; // Engine // Torque setup Vehicle4W->MaxEngineRPM = 5700.0f; Vehicle4W->EngineSetup.TorqueCurve.GetRichCurve()->Reset(); Vehicle4W->EngineSetup.TorqueCurve.GetRichCurve()->AddKey(0.0f, 400.0f); Vehicle4W->EngineSetup.TorqueCurve.GetRichCurve()->AddKey(1890.0f, 500.0f); Vehicle4W->EngineSetup.TorqueCurve.GetRichCurve()->AddKey(5730.0f, 400.0f); // Adjust the steering Vehicle4W->SteeringCurve.GetRichCurve()->Reset(); Vehicle4W->SteeringCurve.GetRichCurve()->AddKey(0.0f, 1.0f); Vehicle4W->SteeringCurve.GetRichCurve()->AddKey(40.0f, 0.7f); Vehicle4W->SteeringCurve.GetRichCurve()->AddKey(120.0f, 0.6f); // Transmission // We want 4wd Vehicle4W->DifferentialSetup.DifferentialType = EVehicleDifferential4W::LimitedSlip_RearDrive; // Drive the front wheels a little more than the rear Vehicle4W->DifferentialSetup.FrontRearSplit = 0.65; // Automatic gearbox Vehicle4W->TransmissionSetup.bUseGearAutoBox = true; // Physics settings // Adjust the center of mass - the buggy is quite low UPrimitiveComponent* UpdatedPrimitive = Cast<UPrimitiveComponent>(Vehicle4W->UpdatedComponent); if (UpdatedPrimitive) { UpdatedPrimitive->BodyInstance.COMNudge = FVector(8.0f, 0.0f, 0.0f); } // Set the inertia scale. This controls how the mass of the vehicle is distributed. Vehicle4W->InertiaTensorScale = FVector(1.0f, 1.333f, 1.2f); // Create a spring arm component for our chase camera SpringArm = CreateDefaultSubobject<USpringArmComponent>(TEXT("SpringArm")); SpringArm->SetRelativeRotation(FRotator(0.0f, 0.0f, 0.0f)); SpringArm->SetRelativeLocation(FVector(0.0f, 0.000f, 0.0f)); SpringArm->AttachTo(RootComponent); SpringArm->TargetArmLength = 200.0f; SpringArm->bEnableCameraLag = true; SpringArm->bEnableCameraRotationLag = true; SpringArm->bInheritPitch = true; SpringArm->bInheritYaw = true; SpringArm->bInheritRoll = true; // Create the chase camera component Camera = CreateDefaultSubobject<UCameraComponent>(TEXT("ChaseCamera")); Camera->AttachTo(SpringArm, USpringArmComponent::SocketName); Camera->SetRelativeRotation(FRotator(-20.0f, 0.0f, 0.0f)); Camera->SetRelativeLocation(FVector(-500.0f, 0.000000f, 300.0f)); Camera->bUsePawnControlRotation = false; Camera->FieldOfView = 90.f; // Create In-Car camera component InternalCameraOrigin = FVector(-34.0f, 0.0f, 50.0f); InternalCamera = CreateDefaultSubobject<UCameraComponent>(TEXT("InternalCamera")); //InternalCamera->AttachTo(SpringArm, USpringArmComponent::SocketName); InternalCamera->bUsePawnControlRotation = false; InternalCamera->FieldOfView = 90.f; InternalCamera->SetRelativeLocation(InternalCameraOrigin); InternalCamera->AttachTo(GetMesh()); // In car HUD // Create text render component for in car speed display InCarSpeed = CreateDefaultSubobject<UTextRenderComponent>(TEXT("IncarSpeed")); InCarSpeed->SetRelativeScale3D(FVector(0.1f, 0.1f, 0.1f)); InCarSpeed->SetRelativeLocation(FVector(35.0f, -6.0f, 20.0f)); InCarSpeed->SetRelativeRotation(FRotator(0.0f, 180.0f, 0.0f)); InCarSpeed->AttachTo(GetMesh()); // Create text render component for in car gear display InCarGear = CreateDefaultSubobject<UTextRenderComponent>(TEXT("IncarGear")); InCarGear->SetRelativeScale3D(FVector(0.1f, 0.1f, 0.1f)); InCarGear->SetRelativeLocation(FVector(35.0f, 5.0f, 20.0f)); InCarGear->SetRelativeRotation(FRotator(0.0f, 180.0f, 0.0f)); InCarGear->AttachTo(GetMesh()); // Setup the audio component and allocate it a sound cue static ConstructorHelpers::FObjectFinder<USoundCue> SoundCue(TEXT("/Game/VehicleAdv/Sound/Engine_Loop_Cue.Engine_Loop_Cue")); EngineSoundComponent = CreateDefaultSubobject<UAudioComponent>(TEXT("EngineSound")); EngineSoundComponent->SetSound(SoundCue.Object); EngineSoundComponent->AttachTo(GetMesh()); // Colors for the in-car gear display. One for normal one for reverse GearDisplayReverseColor = FColor(255, 0, 0, 255); GearDisplayColor = FColor(255, 255, 255, 255); bIsLowFriction = false; bInReverseGear = false; }
ARageEnemyCar::ARageEnemyCar() { // Car mesh static ConstructorHelpers::FObjectFinder<USkeletalMesh> CarMesh(TEXT("/Game/VehicleAdv/Vehicle/Vehicle_SkelMesh.Vehicle_SkelMesh")); GetMesh()->SetSkeletalMesh(CarMesh.Object); static ConstructorHelpers::FClassFinder<UObject> AnimBPClass(TEXT("/Game/VehicleAdv/Vehicle/VehicleAnimationBlueprint")); GetMesh()->SetAnimationMode(EAnimationMode::AnimationBlueprint); GetMesh()->SetAnimInstanceClass(AnimBPClass.Class); UWheeledVehicleMovementComponent4W* Vehicle4W = CastChecked<UWheeledVehicleMovementComponent4W>(GetVehicleMovement()); check(Vehicle4W->WheelSetups.Num() == 4); // Wheels/Tyres // Setup the wheels Vehicle4W->WheelSetups[0].WheelClass = URageWheelFront::StaticClass(); Vehicle4W->WheelSetups[0].BoneName = FName("PhysWheel_FL"); Vehicle4W->WheelSetups[0].AdditionalOffset = FVector(0.f, -8.f, 0.f); Vehicle4W->WheelSetups[1].WheelClass = URageWheelFront::StaticClass(); Vehicle4W->WheelSetups[1].BoneName = FName("PhysWheel_FR"); Vehicle4W->WheelSetups[1].AdditionalOffset = FVector(0.f, 8.f, 0.f); Vehicle4W->WheelSetups[2].WheelClass = URageWheelRear::StaticClass(); Vehicle4W->WheelSetups[2].BoneName = FName("PhysWheel_BL"); Vehicle4W->WheelSetups[2].AdditionalOffset = FVector(0.f, -8.f, 0.f); Vehicle4W->WheelSetups[3].WheelClass = URageWheelRear::StaticClass(); Vehicle4W->WheelSetups[3].BoneName = FName("PhysWheel_BR"); Vehicle4W->WheelSetups[3].AdditionalOffset = FVector(0.f, 8.f, 0.f); // Adjust the tire loading Vehicle4W->MinNormalizedTireLoad = 0.0f; Vehicle4W->MinNormalizedTireLoadFiltered = 0.2f; Vehicle4W->MaxNormalizedTireLoad = 2.0f; Vehicle4W->MaxNormalizedTireLoadFiltered = 2.0f; // Engine // Torque setup Vehicle4W->MaxEngineRPM = 5700.0f; Vehicle4W->EngineSetup.TorqueCurve.GetRichCurve()->Reset(); Vehicle4W->EngineSetup.TorqueCurve.GetRichCurve()->AddKey(0.0f, 400.0f); Vehicle4W->EngineSetup.TorqueCurve.GetRichCurve()->AddKey(1890.0f, 500.0f); Vehicle4W->EngineSetup.TorqueCurve.GetRichCurve()->AddKey(5730.0f, 400.0f); // Adjust the steering Vehicle4W->SteeringCurve.GetRichCurve()->Reset(); Vehicle4W->SteeringCurve.GetRichCurve()->AddKey(0.0f, 1.0f); Vehicle4W->SteeringCurve.GetRichCurve()->AddKey(40.0f, 0.7f); Vehicle4W->SteeringCurve.GetRichCurve()->AddKey(120.0f, 0.6f); // Transmission // We want 4wd Vehicle4W->DifferentialSetup.DifferentialType = EVehicleDifferential4W::LimitedSlip_4W; // Drive the front wheels a little more than the rear Vehicle4W->DifferentialSetup.FrontRearSplit = 0.65; // Automatic gearbox Vehicle4W->TransmissionSetup.bUseGearAutoBox = true; Vehicle4W->TransmissionSetup.GearSwitchTime = 0.15f; Vehicle4W->TransmissionSetup.GearAutoBoxLatency = 1.0f; // Physics settings // Adjust the center of mass - the buggy is quite low UPrimitiveComponent* UpdatedPrimitive = Cast<UPrimitiveComponent>(Vehicle4W->UpdatedComponent); if (UpdatedPrimitive) { UpdatedPrimitive->BodyInstance.COMNudge = FVector(8.0f, 0.0f, 0.0f); } // Set the inertia scale. This controls how the mass of the vehicle is distributed. Vehicle4W->InertiaTensorScale = FVector(1.0f, 1.333f, 1.2f); bIsLowFriction = false; }
float AVehiclePawn::GetEngineMaxRotationSpeed() const { return (GetVehicleMovement()) ? FMath::Abs(GetVehicleMovement()->MaxEngineRPM) : 1.f; }
float AVehiclePawn::GetEngineRotationSpeed() const { return (GetVehicleMovement()) ? FMath::Abs(GetVehicleMovement()->GetEngineRotationSpeed()) : 0.0f; }
float AVehiclePawn::GetVehicleSpeed() const { return (GetVehicleMovement()) ? FMath::Abs(GetVehicleMovement()->GetForwardSpeed()) : 0.0f; }
void AVehiclePawn::UpdateWheelEffects(float DeltaTime) { if (bTiresTouchingGround == false && LandingSound) //we don't update bTiresTouchingGround until later in this function, so we can use it here to determine whether we're landing { float MaxSpringForce = GetVehicleMovement()->GetMaxSpringForce(); if (MaxSpringForce > SpringCompressionLandingThreshold) { UGameplayStatics::PlaySoundAtLocation(this, LandingSound, GetActorLocation()); } } bTiresTouchingGround = false; if (DustType && !bIsDying && GetVehicleMovement() && GetVehicleMovement()->Wheels.Num() > 0) { const float CurrentSpeed = GetVehicleSpeed(); for (int32 i = 0; i < ARRAY_COUNT(DustPSC); i++) { UPhysicalMaterial* ContactMat = GetVehicleMovement()->Wheels[i]->GetContactSurfaceMaterial(); if (ContactMat != NULL) { bTiresTouchingGround = true; } UParticleSystem* WheelFX = DustType->GetDustFX(ContactMat, CurrentSpeed); const bool bIsActive = DustPSC[i] != NULL && !DustPSC[i]->bWasDeactivated && !DustPSC[i]->bWasCompleted; UParticleSystem* CurrentFX = DustPSC[i] != NULL ? DustPSC[i]->Template : NULL; if (WheelFX != NULL && (CurrentFX != WheelFX || !bIsActive)) { if (DustPSC[i] == NULL || !DustPSC[i]->bWasDeactivated) { if (DustPSC[i] != NULL) { DustPSC[i]->SetActive(false); DustPSC[i]->bAutoDestroy = true; } SpawnNewWheelEffect(i); } DustPSC[i]->SetTemplate(WheelFX); DustPSC[i]->ActivateSystem(); } else if (WheelFX == NULL && bIsActive) { DustPSC[i]->SetActive(false); } } } if (SkidAC != NULL) { FVector Vel = GetVelocity(); bool bVehicleStopped = Vel.SizeSquared2D() < SkidThresholdVelocity*SkidThresholdVelocity; bool TireSlipping = GetVehicleMovement()->CheckSlipThreshold(LongSlipSkidThreshold, LateralSlipSkidThreshold); bool bWantsToSkid = bTiresTouchingGround && !bVehicleStopped && TireSlipping; float CurrTime = GetWorld()->GetTimeSeconds(); if (bWantsToSkid && !bSkidding) { bSkidding = true; SkidAC->Play(); SkidStartTime = CurrTime; } if (!bWantsToSkid && bSkidding) { bSkidding = false; SkidAC->FadeOut(SkidFadeoutTime, 0); if (CurrTime - SkidStartTime > SkidDurationRequiredForStopSound) { UGameplayStatics::PlaySoundAtLocation(this, SkidSoundStop, GetActorLocation()); } } } }
ARacerPawn::ARacerPawn(const FObjectInitializer& ObjectInitializer) : Super(ObjectInitializer) { // Car mesh static ConstructorHelpers::FObjectFinder<USkeletalMesh> CarMesh(TEXT("/Game/Vehicle/Sedan/Sedan_SkelMesh.Sedan_SkelMesh")); GetMesh()->SetSkeletalMesh(CarMesh.Object); static ConstructorHelpers::FClassFinder<UObject> AnimBPClass(TEXT("/Game/Vehicle/Sedan/Sedan_AnimBP")); GetMesh()->SetAnimInstanceClass(AnimBPClass.Class); // Simulation UWheeledVehicleMovementComponent4W* Vehicle4W = CastChecked<UWheeledVehicleMovementComponent4W>(GetVehicleMovement()); check(Vehicle4W->WheelSetups.Num() == 4); Vehicle4W->WheelSetups[0].WheelClass = URacerWheelFront::StaticClass(); Vehicle4W->WheelSetups[0].BoneName = FName("Wheel_Front_Left"); Vehicle4W->WheelSetups[0].AdditionalOffset = FVector(0.f, -12.f, 0.f); Vehicle4W->WheelSetups[1].WheelClass = URacerWheelFront::StaticClass(); Vehicle4W->WheelSetups[1].BoneName = FName("Wheel_Front_Right"); Vehicle4W->WheelSetups[1].AdditionalOffset = FVector(0.f, 12.f, 0.f); Vehicle4W->WheelSetups[2].WheelClass = URacerWheelRear::StaticClass(); Vehicle4W->WheelSetups[2].BoneName = FName("Wheel_Rear_Left"); Vehicle4W->WheelSetups[2].AdditionalOffset = FVector(0.f, -12.f, 0.f); Vehicle4W->WheelSetups[3].WheelClass = URacerWheelRear::StaticClass(); Vehicle4W->WheelSetups[3].BoneName = FName("Wheel_Rear_Right"); Vehicle4W->WheelSetups[3].AdditionalOffset = FVector(0.f, 12.f, 0.f); // Create a spring arm component SpringArm = CreateDefaultSubobject<USpringArmComponent>(TEXT("SpringArm0")); SpringArm->TargetOffset = FVector(0.f, 0.f, 200.f); SpringArm->SetRelativeRotation(FRotator(-15.f, 0.f, 0.f)); SpringArm->AttachTo(RootComponent); SpringArm->TargetArmLength = 600.0f; SpringArm->bEnableCameraRotationLag = true; SpringArm->CameraRotationLagSpeed = 7.f; SpringArm->bInheritPitch = false; SpringArm->bInheritRoll = false; // Create camera component Camera = CreateDefaultSubobject<UCameraComponent>(TEXT("Camera0")); Camera->AttachTo(SpringArm, USpringArmComponent::SocketName); Camera->bUsePawnControlRotation = false; Camera->FieldOfView = 90.f; // Create In-Car camera component InternalCameraOrigin = FVector(8.0f, -40.0f, 130.0f); InternalCamera = CreateDefaultSubobject<UCameraComponent>(TEXT("InternalCamera")); InternalCamera->AttachTo(SpringArm, USpringArmComponent::SocketName); InternalCamera->bUsePawnControlRotation = false; InternalCamera->FieldOfView = 90.f; InternalCamera->SetRelativeLocation(InternalCameraOrigin); InternalCamera->AttachTo(GetMesh()); // Create text render component for in car speed display InCarSpeed = CreateDefaultSubobject<UTextRenderComponent>(TEXT("IncarSpeed")); InCarSpeed->SetRelativeLocation(FVector(70.0f, -75.0f, 99.0f)); InCarSpeed->SetRelativeRotation(FRotator(18.0f, 180.0f, 0.0f)); InCarSpeed->AttachTo(GetMesh()); InCarSpeed->SetRelativeScale3D(FVector(1.0f, 0.4f, 0.4f)); // Create text render component for in car gear display InCarGear = CreateDefaultSubobject<UTextRenderComponent>(TEXT("IncarGear")); InCarGear->SetRelativeLocation(FVector(66.0f, -9.0f, 95.0f)); InCarGear->SetRelativeRotation(FRotator(25.0f, 180.0f,0.0f)); InCarGear->SetRelativeScale3D(FVector(1.0f, 0.4f, 0.4f)); InCarGear->AttachTo(GetMesh()); // Colors for the incar gear display. One for normal one for reverse GearDisplayReverseColor = FColor(255, 0, 0, 255); GearDisplayColor = FColor(255, 255, 255, 255); // Colors for the in-car gear display. One for normal one for reverse GearDisplayReverseColor = FColor(255, 0, 0, 255); GearDisplayColor = FColor(255, 255, 255, 255); bInReverseGear = false; }