본문 바로가기
언리얼/기능, 팁 등등 노트

[UE4]캐릭터의 이동 및 회전 보간(마우스 클릭, TopdownView)

by 개발펭귄 2018. 10. 25.

탑다운에서의 마우스 클릭을 통한 이동은 WASD 와 마우스 회전 축에 따른 이동방식과는 다르게


마우스 회전값을 캐릭터 회전값에 맵핑하는 방식이 아니다.


따라서 캐릭터가 이동할 때, 이동할 방향을 구해 회전값을 보간하여 자연스럽게 캐릭터를 회전시켜주어야 한다.


아래는 구현된 예시 코드이다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void APlayerCharacterController::MoveAndRotation(float DeltaTime)
{
    ACharacter* Character = GetCharacter();
 
    //Smooth Move
    UCharacterMovementComponent* MovementComponent = Character->GetCharacterMovement();
    float Speed = MovementComponent->MaxWalkSpeed;
    FVector Direction = (TargetLocation - Character->GetActorLocation()).GetSafeNormal();
    MovementComponent->MoveSmooth(Direction * Speed, DeltaTime);
 
    //Smooth Rotation
    SmoothRotator = FMath::RInterpTo(SmoothRotator, TargetRotator, DeltaTime, SmoothTargetViewRotationSpeed);
    SetControlRotation(SmoothRotator);
}
 
cs


이동의 경우, 마우스가 클릭한 좌표(TargetLocation)과 캐릭터 좌표를 통해 방향벡터를 구한다.

이후, MovementComponent의 MoveSmooth 를 통해 속도와 DeltaTime을 넣어주면 자연스럽게 이동한다.


회전의 경우, RInterpTo라는 회전보간함수를 이용해 이전회전값과 목표지점을 향한 회전값을 구해 DeltaTime과 회전속도를 넣어주면 된다. 

Vector가 아닌 Rotator를 넣어줘야한다는 점 기억하자.


1
2
3
4
5
6
7
8
void APlayerCharacterController::SetTargetLocation(FVector InTargetLocation)
{
    TargetLocation = InTargetLocation;
    bHasTargetLocation = true;
 
    TargetRotator = UKismetMathLibrary::FindLookAtRotation(GetCharacter()->GetActorLocation(), TargetLocation);
    SmoothRotator = GetCharacter()->GetActorRotation();
}
cs


목표지점을 향항 회전값은 LooAtRotion을 통해 바로 구할 수 있다.


적다보니 생각난건데 그냥 위에서 구한 Direction.Rotation()을 통해 바로 할 수도 있다.