탑다운에서의 마우스 클릭을 통한 이동은 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()을 통해 바로 할 수도 있다.
'언리얼 > 기능, 팁 등등 노트' 카테고리의 다른 글
[UE4]데칼 생성(스폰)(코드) (0) | 2018.11.13 |
---|---|
[UE4]코드 상에서 머티리얼 로드 (0) | 2018.11.13 |
[UE4]캐릭터의 속도 계산 (0) | 2018.08.10 |
[UE4]월드 안의 액터 혹은 오브젝트 읽기 (0) | 2018.08.09 |
[UE4]카메라 LookAt (0) | 2018.08.09 |