오늘의 개발
생성자
APlayerDoll::APlayerDoll()
{
PrimaryActorTick.bCanEverTick = true;
// RootComponent 생성
RootComponent = CreateDefaultSubobject<USceneComponent>(TEXT("RootComponent"));
// SpringArm 생성 및 위치 조정
DefaultCameraSpringArm = CreateDefaultSubobject<USpringArmComponent>(TEXT("CameraSpringArm"));
DefaultCameraSpringArm->SetupAttachment(RootComponent); // RootComponent에 SpringArm Attach
// SpringArm 초기 위치 설정
DefaultCameraSpringArm->SetRelativeLocationAndRotation(FVector(0.0f,0.0f,0.0f), FRotator(60.0f, 0.0f, 0.0f));
DefaultCameraSpringArm->TargetArmLength = 0.0f;
DefaultCameraSpringArm->bEnableCameraLag = true;
DefaultCameraSpringArm->CameraLagSpeed = 3.0f;
// Camera 생성 및 SpringArm 소켓에 위치
DefaultCamera = CreateDefaultSubobject<UCameraComponent>(TEXT("GameCamera"));
DefaultCamera->SetupAttachment(DefaultCameraSpringArm, USpringArmComponent::SocketName);
// 기본 플레이어로 지정
AutoPossessPlayer = EAutoReceiveInput::Player0;
// 기본 줌인 여부 설정
IsMouseRightButtonClick = false;
}
void APlayerDoll::BeginPlay()
{
Super::BeginPlay();
// Pawn 초기 위치 설정
this->SetActorLocation(FVector(0.0f, 0.0f, 50.0f));
if (GEngine) {
GEngine->AddOnScreenDebugMessage(-1, 5.0f, FColor::Red, TEXT("Me are using Character"));
}
}
void APlayerDoll::Tick(float DeltaTime)
{
Super::Tick(DeltaTime);
// Zoom 설정
if(IsMouseRightButtonClick)
{
ZoomScale += DeltaTime / 0.5f;
}
else
{
ZoomScale -= DeltaTime / 0.25f;
}
// Zoom은 0~1 범위
ZoomScale = FMath::Clamp<float>(ZoomScale, 0.0f, 0.4f);
// Lerp -> Linear Interpolation으로 Zoom을 설정
DefaultCamera->FieldOfView = FMath::Lerp<float>(400.0f, 300.0f, ZoomScale);
DefaultCameraSpringArm->TargetArmLength = FMath::Lerp<float>(400.0f, 300.0f, ZoomScale);
}
void APlayerDoll::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent)
{
// PlayerInputComponent에서 받아온 입력을 Binding 해준다.
Super::SetupPlayerInputComponent(PlayerInputComponent);
// Action Mapping의 Binding
InputComponent->BindAction("ZoomIn", IE_Pressed, this, &APlayerDoll::ZoomIn);
InputComponent->BindAction("ZoomIn", IE_Released, this, &APlayerDoll::ZoomOut);
// Axis Mapping의 Binding
InputComponent->BindAxis("MoveForward", this, &APlayerDoll::MoveForward);
InputComponent->BindAxis("MoveRight", this, &APlayerDoll::MoveRight);
InputComponent->BindAxis("CameraPitch", this, &APlayerDoll::ChangeCameraPitch);
InputComponent->BindAxis("CameraYaw", this, &APlayerDoll::ChangeCameraYaw);
}
입력 바인딩 파트
void APlayerDoll::MoveForward(float AxisValue)
{
FVector NewLocation = NewLocation = GetActorLocation();
// SpringArm을 기준으로 하여 현재 바라보고 있는 화면 기준으로 위치이동이 가능하게 함.
NewLocation += this->GetActorForwardVector() * (AxisValue * 10); // 이동속도 결정
this->SetActorLocation(NewLocation);
}
void APlayerDoll::MoveRight(float AxisValue)
{
FVector NewLocation = NewLocation = GetActorLocation();
// SpringArm을 기준으로 하여 현재 바라보고 있는 화면 기준으로 위치이동이 가능하게 함.
NewLocation += this->GetActorRightVector() * (AxisValue * 10); // 이동속도 결정
this->SetActorLocation(NewLocation);
}
void APlayerDoll::ChangeCameraPitch(float AxisValue)
{
// SpringArm을 위 아래로 조정.
FRotator NewRotation = DefaultCameraSpringArm->GetComponentRotation();
// Clamp를 통해 Y축 이동범위 제한
NewRotation.Pitch = FMath::Clamp(NewRotation.Pitch + AxisValue, -80.0f, 80.0f);
DefaultCameraSpringArm->SetWorldRotation(NewRotation);
}
void APlayerDoll::ChangeCameraYaw(float AxisValue)
{
// Actor의 시야를 양 옆으로 조절.
FRotator NewRotation = this->GetActorRotation();
// Clamp를 통한 제한은 없음.
NewRotation.Yaw += AxisValue;
this->SetActorRotation(NewRotation);
}
void APlayerDoll::ZoomIn()
{
IsMouseRightButtonClick = true;
}
void APlayerDoll::ZoomOut()
{
IsMouseRightButtonClick = false;
}
각 입력을 처리해주는 부분.
오늘의 어려웠던 점: