오늘의 개발

생성자

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;
}

각 입력을 처리해주는 부분.

오늘의 어려웠던 점: