반응형
헤더
// Fill out your copyright notice in the Description page of Project Settings.
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/Character.h"
#include <Components/WidgetComponent.h>
#include "CC_KangnamMain.generated.h"
UENUM(BlueprintType)
enum EPlayer_Rotation
{
Stop_walk = -1,
Left_walk = 270,
Right_walk = 90,
Forward_walk = 0,
LF_walk=315,
RF_walk=45,
Backward_walk = 180,
LB_walk=225,
RB_walk=135
};
USTRUCT(BlueprintType)
struct FTransmissionData_ClientToServer
{
GENERATED_BODY()
//Current Location
float location_X;
float location_Y;
float location_Z;
//velocity
float Velocity_X;
float Velocity_Y;
float Velocity_Z;
//Rotatio
EPlayer_Rotation Direction;
};
/**
*
*/
UCLASS()
class KANGNAMSQUARE_API ACC_KangnamMain : public ACharacter
{
GENERATED_BODY()
public:
ACC_KangnamMain();
FTransmissionData_ClientToServer Call_MovePacket();
public:
int32 FState; // 뒤 중 앞 7 0 4
int32 ForwardCheckValue;
int32 RState; // 좌 중 우 1 0 2
int32 RightCheckValue;
int32 Move_ResultData;
EPlayer_Rotation Current_PlayerRotation;
protected:
// Called when the game starts or when spawned
virtual void BeginPlay() override;
// Called every frame
virtual void Tick(float DeltaTime) override;
// Called to bind functionality to input
virtual void SetupPlayerInputComponent(class UInputComponent* PlayerInputComponent) override;
void MoveForward(float Value);
void MoveRight(float Value);
void Turn(float Value);
enum class EViewMode
{
TopView,
TPerson_View,
FPerson_View
};
void ChangeViewMode();
void SetViewMode(EViewMode NewViewMode);
EViewMode CurrentViewMode = EViewMode::TopView;
FVector DirectionToMove=FVector::ZeroVector;
private:
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category=Camera,meta=(AllowPrivateAccess="true"))
class USpringArmComponent* CameraArm;
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category=Camera,meta=(AllowPrivateAccess="true"))
class UCameraComponent* MainCamera;
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = widget, meta = (AllowPrivateAccess = "true"))
class UWidgetComponent* _chatWidget;
UPROPERTY(VisibleAnywhere)
UCapsuleComponent* Player_Capsule;
public:
void ShowChat(FString chat);
};
cpp
// Fill out your copyright notice in the Description page of Project Settings.
#include "Jinsoo_Character.h"
#include "Components/CapsuleComponent.h"
#include "Camera/CameraComponent.h"
#include "GameFramework/CharacterMovementComponent.h"
#include "GameFramework/SpringArmComponent.h"
AJinsoo_Character::AJinsoo_Character()
{
// Set this character to call Tick() every frame. You can turn this off to improve performance if you don't need it.
PrimaryActorTick.bCanEverTick = true;
GetCapsuleComponent()->InitCapsuleSize(42.f,96.f);
CameraArm=CreateDefaultSubobject<USpringArmComponent>(TEXT("CameraArm"));
CameraArm->SetupAttachment(RootComponent);
MainCamera=CreateDefaultSubobject<UCameraComponent>(TEXT("MainCamera"));
MainCamera->SetupAttachment(CameraArm,USpringArmComponent::SocketName);
FState=0;
RState=0;
ForwardCheckValue=FState;
RightCheckValue=RState;
SetViewMode(EViewMode::TopView);
}
// Called when the game starts or when spawned
void AJinsoo_Character::BeginPlay()
{
Super::BeginPlay();
}
// Called every frame
void AJinsoo_Character::Tick(float DeltaTime)
{
Super::Tick(DeltaTime);
if(ForwardCheckValue!=FState)
{
ForwardCheckValue=FState;
Move_ResultData=ForwardCheckValue+RightCheckValue;
GEngine->AddOnScreenDebugMessage(-1,2.f,FColor::Red,FString::Printf(TEXT("%d"),Move_ResultData));
switch (Move_ResultData)
{
case 0:
Current_PlayerRotation=Stop_walk;
break;
case 1:
Current_PlayerRotation=Left_walk;
break;
case 2:
Current_PlayerRotation=Right_walk;
break;
case 4:
Current_PlayerRotation=Forward_walk;
break;
case 5:
Current_PlayerRotation=LF_walk;
break;
case 6:
Current_PlayerRotation=RF_walk;
break;
case 7:
Current_PlayerRotation=Backward_walk;
break;
case 8:
Current_PlayerRotation=LB_walk;
break;
case 9:
Current_PlayerRotation=RB_walk;
break;
default:
break;
}
}
if(RightCheckValue!=RState)
{
RightCheckValue=RState;
Move_ResultData=ForwardCheckValue+RightCheckValue;
GEngine->AddOnScreenDebugMessage(-1,2.f,FColor::Red,FString::Printf(TEXT("%d"),Move_ResultData));
switch (Move_ResultData)
{
case 0:
Current_PlayerRotation=Stop_walk;
break;
case 1:
Current_PlayerRotation=Left_walk;
break;
case 2:
Current_PlayerRotation=Right_walk;
break;
case 4:
Current_PlayerRotation=Forward_walk;
break;
case 5:
Current_PlayerRotation=LF_walk;
break;
case 6:
Current_PlayerRotation=RF_walk;
break;
case 7:
Current_PlayerRotation=Backward_walk;
break;
case 8:
Current_PlayerRotation=LB_walk;
break;
case 9:
Current_PlayerRotation=RB_walk;
break;
default:
break;
}
}
//camera rotation setting
switch (CurrentViewMode)
{
case EViewMode::TopView:
if(DirectionToMove.SizeSquared()>0.0f)
{
GetController()->SetControlRotation(FRotationMatrix::MakeFromX(DirectionToMove).Rotator());
AddMovementInput(DirectionToMove);
}
break;
case EViewMode::TPerson_View:
GetController()->SetControlRotation(GetActorRotation());
break;
case EViewMode::FPerson_View:
GetController()->SetControlRotation(GetActorRotation());
break;
}
}
// Called to bind functionality to input
void AJinsoo_Character::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent)
{
Super::SetupPlayerInputComponent(PlayerInputComponent);
PlayerInputComponent->BindAction("Change_View",EInputEvent::IE_Pressed,this,&AJinsoo_Character::ChangeViewMode);
PlayerInputComponent->BindAxis("MoveForward",this,&AJinsoo_Character::MoveForward);
PlayerInputComponent->BindAxis("MoveRight",this,&AJinsoo_Character::MoveRight);
}
void AJinsoo_Character::MoveForward(float Value)
{
if ((Controller != NULL) && (Value != 0.0f))
{
if((Value>=0.5f)||(Value<=-0.5f))
{
if(Value>=0.5f) {FState=4;}
if(Value<=-0.5f) {FState=7;}
switch (CurrentViewMode)
{
case EViewMode::TopView:
DirectionToMove.X=Value;
break;
case EViewMode::TPerson_View:
AddMovementInput(FRotationMatrix(FRotator(0.f,GetControlRotation().Yaw,0.f)).GetUnitAxis(EAxis::X),Value);
break;
case EViewMode::FPerson_View:
AddMovementInput(FRotationMatrix(FRotator(0.f,GetControlRotation().Yaw,0.f)).GetUnitAxis(EAxis::X),Value);
break;
}
}
else
{
switch (CurrentViewMode)
{
case EViewMode::TopView:
DirectionToMove.X=0.f;
break;
default:
break;
}
FState=0;
}
}
else if(Value==0.0f)
{
switch (CurrentViewMode)
{
case EViewMode::TopView:
DirectionToMove.X=0.f;
break;
default:
break;
}
FState=0;
}
}
void AJinsoo_Character::MoveRight(float Value)
{
if ((Controller != NULL) && (Value != 0.0f))
{
if((Value>=0.5)||(Value<=-0.5))
{
if(Value>=0.5f) {RState=2;}
if(Value<=-0.5f) {RState=1;}
switch (CurrentViewMode)
{
case EViewMode::TopView:
DirectionToMove.Y=Value;
break;
case EViewMode::TPerson_View:
AddMovementInput(FRotationMatrix(FRotator(0.f,GetControlRotation().Yaw,0.f)).GetUnitAxis(EAxis::Y),Value);
break;
case EViewMode::FPerson_View:
AddMovementInput(FRotationMatrix(FRotator(0.f,GetControlRotation().Yaw,0.f)).GetUnitAxis(EAxis::Y),Value);
break;
}
}
else
{
switch (CurrentViewMode)
{
case EViewMode::TopView:
DirectionToMove.Y=0.f;
break;
default:
break;
}
RState=0;
}
}
else if(Value==0.0f)
{
switch (CurrentViewMode)
{
case EViewMode::TopView:
DirectionToMove.Y=0.f;
break;
default:
break;
}
RState=0;
}
}
void AJinsoo_Character::Turn(float Value)
{
switch (CurrentViewMode)
{
case EViewMode::TPerson_View:
AddControllerYawInput(Value);
break;
case EViewMode::FPerson_View:
AddControllerYawInput(Value);
break;
default:
break;
}
}
FTransmission_Data_ClientToServer AJinsoo_Character::Call_MovePacket()
{
FTransmission_Data_ClientToServer Packet;
Packet.location_X=GetActorLocation().X;
Packet.location_Y=GetActorLocation().Y;
Packet.location_Z=GetActorLocation().Z;
Packet.Velocity_X=GetVelocity().X;
Packet.Velocity_Y=GetVelocity().Y;
Packet.Velocity_Z=GetVelocity().Z;
Packet.Direction=Current_PlayerRotation;
return Packet;
}
//detail camera setting
void AJinsoo_Character::SetViewMode(EViewMode NewViewMode)
{
CurrentViewMode=NewViewMode;
switch (CurrentViewMode)
{
case EViewMode::TopView:
CameraArm->TargetArmLength=800.f;
CameraArm->SetRelativeRotation(FRotator(-90.f,0.f,0.f));
CameraArm->bUsePawnControlRotation=false;
CameraArm->bInheritPitch=false;
CameraArm->bInheritRoll=false;
CameraArm->bInheritYaw=false;
CameraArm->bDoCollisionTest=false;
bUseControllerRotationYaw=false;
GetCharacterMovement()->bOrientRotationToMovement=false;
GetCharacterMovement()->bUseControllerDesiredRotation=true;
GetCharacterMovement()->RotationRate=FRotator(0.f,360.f,0.f);;
break;
case EViewMode::TPerson_View:
CameraArm->TargetArmLength=600.f;
CameraArm->SetRelativeRotation(FRotator(0.f,0.f,-45.f));
CameraArm->bUsePawnControlRotation=true;
CameraArm->bInheritPitch=true;
CameraArm->bInheritRoll=true;
CameraArm->bInheritYaw=true;
CameraArm->bDoCollisionTest=true;
bUseControllerRotationYaw=false;
GetCharacterMovement()->bOrientRotationToMovement=true;
GetCharacterMovement()->bUseControllerDesiredRotation=false;
GetCharacterMovement()->RotationRate=FRotator(0.f,360.f,0.f);;
break;
case EViewMode::FPerson_View:
CameraArm->TargetArmLength=-100.f;
CameraArm->SetRelativeRotation(FRotator(0.f,180.f,0.f));
CameraArm->bUsePawnControlRotation=true;
CameraArm->bInheritPitch=true;
CameraArm->bInheritRoll=true;
CameraArm->bInheritYaw=true;
CameraArm->bDoCollisionTest=true;
bUseControllerRotationYaw=false;
GetCharacterMovement()->bOrientRotationToMovement=true;
GetCharacterMovement()->bUseControllerDesiredRotation=false;
GetCharacterMovement()->RotationRate=FRotator(0.f,360.f,0.f);
break;
}
}
void AJinsoo_Character::ChangeViewMode()
{
switch (CurrentViewMode)
{
case EViewMode::TopView:
SetViewMode(EViewMode::TPerson_View);
break;
case EViewMode::TPerson_View:
GetController()->SetControlRotation(GetActorRotation());
SetViewMode(EViewMode::FPerson_View);
break;
case EViewMode::FPerson_View:
SetViewMode(EViewMode::TopView);
break;
}
}
반응형
'Unreal Engine 4 > Unreal Engine 4 개발일지' 카테고리의 다른 글
Unreal Engine 4 개발 - TopDownCharacter C++ 해석 2 (0) | 2021.07.22 |
---|---|
Unreal Engine 4 개발 - TopDownCharacter C++ 해석 (0) | 2021.07.18 |
Unreal Engine 4 개발 C++ 계획표 21.07.10 (0) | 2021.07.10 |
Unreal Engine 4 개발일지 5일차 스킬에 대한 알고리즘 작성 (0) | 2021.05.24 |
Unreal Engine 4 개발일지 4일차 베이스 제작 이후의 기획 (0) | 2021.05.18 |