-
-
Save mojobojo/6fbdd04ac5217bc3cd982ad1884df753 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// Copyright Epic Games, Inc. All Rights Reserved. | |
#include "jetpackCharacter.h" | |
#include "HeadMountedDisplayFunctionLibrary.h" | |
#include "Camera/CameraComponent.h" | |
#include "Components/CapsuleComponent.h" | |
#include "Components/InputComponent.h" | |
#include "GameFramework/CharacterMovementComponent.h" | |
#include "GameFramework/Controller.h" | |
#include "GameFramework/SpringArmComponent.h" | |
////////////////////////////////////////////////////////////////////////// | |
// AjetpackCharacter | |
AjetpackCharacter::AjetpackCharacter() { | |
// Set size for collision capsule | |
GetCapsuleComponent()->InitCapsuleSize(42.f, 96.0f); | |
// set our turn rates for input | |
BaseTurnRate = 45.f; | |
BaseLookUpRate = 45.f; | |
// Don't rotate when the controller rotates. Let that just affect the camera. | |
bUseControllerRotationPitch = false; | |
bUseControllerRotationYaw = false; | |
bUseControllerRotationRoll = false; | |
// Configure character movement | |
GetCharacterMovement()->bOrientRotationToMovement = true; // Character moves in the direction of input... | |
GetCharacterMovement()->RotationRate = FRotator(0.0f, 540.0f, 0.0f); // ...at this rotation rate | |
GetCharacterMovement()->JumpZVelocity = 600.f; | |
GetCharacterMovement()->AirControl = 0.2f; | |
// Create a camera boom (pulls in towards the player if there is a collision) | |
CameraBoom = CreateDefaultSubobject<USpringArmComponent>(TEXT("CameraBoom")); | |
CameraBoom->SetupAttachment(RootComponent); | |
CameraBoom->TargetArmLength = 300.0f; // The camera follows at this distance behind the character | |
CameraBoom->bUsePawnControlRotation = true; // Rotate the arm based on the controller | |
// Create a follow camera | |
FollowCamera = CreateDefaultSubobject<UCameraComponent>(TEXT("FollowCamera")); | |
FollowCamera->SetupAttachment(CameraBoom, USpringArmComponent::SocketName); // Attach the camera to the end of the boom and let the boom adjust to match the controller orientation | |
FollowCamera->bUsePawnControlRotation = false; // Camera does not rotate relative to arm | |
// Note: The skeletal mesh and anim blueprint references on the Mesh component (inherited from Character) | |
// are set in the derived blueprint asset named MyCharacter (to avoid direct content references in C++) | |
} | |
////////////////////////////////////////////////////////////////////////// | |
// Input | |
void AjetpackCharacter::SetupPlayerInputComponent(class UInputComponent* PlayerInputComponent) { | |
// Set up gameplay key bindings | |
check(PlayerInputComponent); | |
PlayerInputComponent->BindAction("Jump", IE_Pressed, this, &AjetpackCharacter::EnableJetpack); | |
PlayerInputComponent->BindAction("Jump", IE_Released, this, &AjetpackCharacter::DisableJetpack); | |
PlayerInputComponent->BindAxis("MoveForward", this, &AjetpackCharacter::MoveForward); | |
PlayerInputComponent->BindAxis("MoveRight", this, &AjetpackCharacter::MoveRight); | |
// We have 2 versions of the rotation bindings to handle different kinds of devices differently | |
// "turn" handles devices that provide an absolute delta, such as a mouse. | |
// "turnrate" is for devices that we choose to treat as a rate of change, such as an analog joystick | |
PlayerInputComponent->BindAxis("Turn", this, &APawn::AddControllerYawInput); | |
PlayerInputComponent->BindAxis("TurnRate", this, &AjetpackCharacter::TurnAtRate); | |
PlayerInputComponent->BindAxis("LookUp", this, &APawn::AddControllerPitchInput); | |
PlayerInputComponent->BindAxis("LookUpRate", this, &AjetpackCharacter::LookUpAtRate); | |
// handle touch devices | |
PlayerInputComponent->BindTouch(IE_Pressed, this, &AjetpackCharacter::TouchStarted); | |
PlayerInputComponent->BindTouch(IE_Released, this, &AjetpackCharacter::TouchStopped); | |
// VR headset functionality | |
PlayerInputComponent->BindAction("ResetVR", IE_Pressed, this, &AjetpackCharacter::OnResetVR); | |
} | |
void AjetpackCharacter::GetLifetimeReplicatedProps(TArray <FLifetimeProperty> &OutLifetimeProps) const { | |
Super::GetLifetimeReplicatedProps(OutLifetimeProps); | |
} | |
void AjetpackCharacter::FireJetpack_Implementation() { | |
UCharacterMovementComponent *movement = GetCharacterMovement(); | |
if (jetpack_active) { | |
movement->MovementMode = MOVE_Flying; | |
FVector velocity = movement->Velocity; | |
velocity.Z += 25.0f; | |
movement->Velocity = velocity; | |
//FVector force = FVector::UpVector; | |
//force = force * 250.0f; | |
//movement->AddForce(force); | |
} else { | |
if (movement->MovementMode == MOVE_Flying) { | |
movement->MovementMode = MOVE_Falling; | |
} | |
} | |
} | |
void AjetpackCharacter::Tick(float DeltaSeconds) { | |
UCharacterMovementComponent *movement = GetCharacterMovement(); | |
ENetRole net_role = GetLocalRole(); | |
FireJetpack(); | |
if (net_role == ROLE_Authority) { | |
} else { | |
} | |
} | |
void AjetpackCharacter::SetJetpackFiringOnServer_Implementation(bool firing) { | |
//GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Orange, FString::Printf(TEXT("local role = %d"), GetLocalRole())); | |
//GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Orange, FString::Printf(TEXT("remote role = %d"), GetRemoteRole())); | |
jetpack_active = firing; | |
} | |
void AjetpackCharacter::EnableJetpack() { | |
SetJetpackFiringOnServer(true); | |
//jetpack_enabled = true; | |
//GetCharacterMovement()->MovementMode = MOVE_Flying; | |
} | |
void AjetpackCharacter::DisableJetpack() { | |
SetJetpackFiringOnServer(false); | |
//jetpack_enabled = false; | |
//GetCharacterMovement()->MovementMode = MOVE_Falling; | |
} | |
void AjetpackCharacter::OnResetVR() { | |
UHeadMountedDisplayFunctionLibrary::ResetOrientationAndPosition(); | |
} | |
void AjetpackCharacter::TouchStarted(ETouchIndex::Type FingerIndex, FVector Location) { | |
Jump(); | |
} | |
void AjetpackCharacter::TouchStopped(ETouchIndex::Type FingerIndex, FVector Location) { | |
StopJumping(); | |
} | |
void AjetpackCharacter::TurnAtRate(float Rate) { | |
// calculate delta for this frame from the rate information | |
AddControllerYawInput(Rate * BaseTurnRate * GetWorld()->GetDeltaSeconds()); | |
} | |
void AjetpackCharacter::LookUpAtRate(float Rate) { | |
// calculate delta for this frame from the rate information | |
AddControllerPitchInput(Rate * BaseLookUpRate * GetWorld()->GetDeltaSeconds()); | |
} | |
void AjetpackCharacter::MoveForward(float Value) { | |
if ((Controller != NULL) && (Value != 0.0f)) | |
{ | |
// find out which way is forward | |
const FRotator Rotation = Controller->GetControlRotation(); | |
const FRotator YawRotation(0, Rotation.Yaw, 0); | |
// get forward vector | |
const FVector Direction = FRotationMatrix(YawRotation).GetUnitAxis(EAxis::X); | |
AddMovementInput(Direction, Value); | |
} | |
} | |
void AjetpackCharacter::MoveRight(float Value) { | |
if ( (Controller != NULL) && (Value != 0.0f) ) | |
{ | |
// find out which way is right | |
const FRotator Rotation = Controller->GetControlRotation(); | |
const FRotator YawRotation(0, Rotation.Yaw, 0); | |
// get right vector | |
const FVector Direction = FRotationMatrix(YawRotation).GetUnitAxis(EAxis::Y); | |
// add movement in that direction | |
AddMovementInput(Direction, Value); | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// Copyright Epic Games, Inc. All Rights Reserved. | |
#pragma once | |
#include "CoreMinimal.h" | |
#include "GameFramework/Character.h" | |
#include "Net/UnrealNetwork.h" | |
#include "jetpackCharacter.generated.h" | |
UCLASS(config=Game) | |
class AjetpackCharacter : public ACharacter { | |
GENERATED_BODY() | |
/** Camera boom positioning the camera behind the character */ | |
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = Camera, meta = (AllowPrivateAccess = "true")) | |
class USpringArmComponent* CameraBoom; | |
/** Follow camera */ | |
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = Camera, meta = (AllowPrivateAccess = "true")) | |
class UCameraComponent* FollowCamera; | |
public: | |
AjetpackCharacter(); | |
/** Property replication */ | |
void GetLifetimeReplicatedProps(TArray<FLifetimeProperty> &OutLifetimeProps) const override; | |
/** Base turn rate, in deg/sec. Other scaling may affect final turn rate. */ | |
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category=Camera) | |
float BaseTurnRate; | |
/** Base look up/down rate, in deg/sec. Other scaling may affect final rate. */ | |
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category=Camera) | |
float BaseLookUpRate; | |
protected: | |
UPROPERTY(Replicated) | |
bool jetpack_active = false; | |
UFUNCTION(NetMulticast, Unreliable) | |
void FireJetpack(); | |
UFUNCTION(Server, Unreliable) | |
void SetJetpackFiringOnServer(bool firing); | |
/** Resets HMD orientation in VR. */ | |
void OnResetVR(); | |
/** Called for forwards/backward input */ | |
void MoveForward(float Value); | |
/** Called for side to side input */ | |
void MoveRight(float Value); | |
/** | |
* Called via input to turn at a given rate. | |
* @param Rate This is a normalized rate, i.e. 1.0 means 100% of desired turn rate | |
*/ | |
void TurnAtRate(float Rate); | |
/** | |
* Called via input to turn look up/down at a given rate. | |
* @param Rate This is a normalized rate, i.e. 1.0 means 100% of desired turn rate | |
*/ | |
void LookUpAtRate(float Rate); | |
/** Handler for when a touch input begins. */ | |
void TouchStarted(ETouchIndex::Type FingerIndex, FVector Location); | |
/** Handler for when a touch input stops. */ | |
void TouchStopped(ETouchIndex::Type FingerIndex, FVector Location); | |
void EnableJetpack(); | |
void DisableJetpack(); | |
protected: | |
virtual void Tick(float DeltaSeconds) override; | |
// APawn interface | |
virtual void SetupPlayerInputComponent(class UInputComponent* PlayerInputComponent) override; | |
// End of APawn interface | |
public: | |
/** Returns CameraBoom subobject **/ | |
FORCEINLINE class USpringArmComponent* GetCameraBoom() const { return CameraBoom; } | |
/** Returns FollowCamera subobject **/ | |
FORCEINLINE class UCameraComponent* GetFollowCamera() const { return FollowCamera; } | |
}; | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment