2022/03/14 강남스퀘어 캐릭터 백업본

2022. 3. 14. 16:17·Unreal Engine 4/Unreal Engine 4 개발일지
반응형

헤더

// 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
'Unreal Engine 4/Unreal Engine 4 개발일지' 카테고리의 다른 글
  • Unreal Engine 4 개발 - TopDownCharacter C++ 해석 2
  • Unreal Engine 4 개발 - TopDownCharacter C++ 해석
  • Unreal Engine 4 개발 C++ 계획표 21.07.10
  • Unreal Engine 4 개발일지 5일차 스킬에 대한 알고리즘 작성
숯불돼지왕갈비
숯불돼지왕갈비
  • 숯불돼지왕갈비
    게임 개발 공부기
    숯불돼지왕갈비
  • 전체
    오늘
    어제
    • 분류 전체보기 (303) N
      • 학교수업 (165)
      • 취업강의 (6)
      • C++ (46) N
        • 코딩 테스트 (4)
      • Unreal Engine 5 (25)
        • MMORPG 개발 (25)
      • Unreal Engine 4 (44)
        • Omak Project (3)
        • Unreal Engine 4 개발일지 (9)
        • Unreal Engine 4 (32)
      • Unity (1)
        • 개발 일지 (1)
      • 수학 (3)
        • 소프트웨어 공학용 수학 (3)
      • DirectX 11 (4)
      • 게임 디자인 패턴 (2)
      • 포트폴리오 (1)
      • 자격증 (1)
        • 정보처리기사 (0)
        • SQLD (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
숯불돼지왕갈비
2022/03/14 강남스퀘어 캐릭터 백업본
상단으로

티스토리툴바