Targeting & Camera
코드 - CombatComponent
.h https://github.com/LCU97/Cat/blob/main/Source/HumanAndCat/Public/Components/BaseCombatComponent.h
.cpp https://github.com/LCU97/Cat/blob/main/Source/HumanAndCat/Private/Components/BaseCombatComponent.cpp
코드 - CameraManagerComponent
.h https://github.com/LCU97/Cat/blob/main/Source/HumanAndCat/Public/Components/CameraManagerComponent.h
경험과 결과
주요 클래스 및 함수 설명
1. 경험 및 실패
프로젝트하면서 가장 많이 실패한 부분이다. 사실 Targeting 은 생각보다 쉽게 끝났지만, 카메라에서 많이 실패했다. TargetActor 가 설정되면 캐릭터도 카메라도 TargetActor 를 바라보며 움직이기 시작한다.
카메라도 같이 캐릭터를 따라 움직면서 TargetActor 를 바라보니 굉장히 화면이 딱딱해보였고, 이것을 고치고 싶었다.
실패와 성공
실패 1 : 카메라와 캐릭터의 월드 좌표에서 거리가 일정 거리 안에 있으면 카메라가 안움직이게 만들었다.
==> 카메라의 스프링암이 캐릭터에 Attach 되어 있어 카메라를 계속 고정하기 어려워 실패했다. 따라오는 카메라 움직임도 자연스럽지 않았다.
실패 2 : TargetActor 가 설정되면 카메라를 GameMode 에 Attach 하여 플레이어를 따라다니지 않도록 만들었다. 또, 플레이어의 월드 좌표를 뷰 좌표로 변환하였고 뷰 좌표에 가상의 박스를 만들어 박스 내에 플레이어 좌표가 있다면 카메라의 움직임을 제한했다.
==> 좌우 움직임은 자연스럽게 성공했지만 플레이어의 앞뒤 움직임에는 여전히 문제가 많았다. 보간 값을 View Space 의 중점과 플레이어의 뷰 좌표의 거리로 계산했기 때문에 앞뒤 움직임에 대해서 보간 값이 항상 작게 나와 카메라가 느리게 움직였다.
실패 3 : 앞뒤 /// 좌우 로 나누어 카메라 움직임을 각각 따로 보간하게 만들었다.
==> 앞뒤 /// 좌우의 각자 움직임에는 문제가 없었다. 하지만 대각선 움직임에서 앞뒤 / 좌우 보간이 겹치면서 다시 문제가 발생했다.
성공 : 카메라 움직임에 대하여 보간은 1가지로만 진행한다. 카메라의 움직임을 제한하는 방식으로는 View Space 방식을 사용했다. 다만, 보간의 Alpha 값 계산에서는 View Space 의 중점과 플레이어의 View 좌표 거리로 계산하지 않고 World 좌표의 카메라와 플레이어의 거리를 특정 float 값을 기준으로 하여 Alpha 값을 만들었다. 앞뒤좌우에 대해서 자연스러운 움직임을 만들었다.
2. 주요 클래스 및 함수 설명
CombatComponent :
특징 1) FindInRandgeTargets 함수로 특정 범위 내에 TargetActor 들을 먼저 찾고 SelectTarget 로 최종 TargetActor 를 선정한다.
FindInRandgeTargets : Sphere 안에 원하는 오브젝트 타입 및 클래스에 해당하는 Actor 들을 저장한다.
SelectTarget : CalculateAngleFromCamera 함수로 거리 계산 후 제일 짧은 거리에 있는 Actor 를 TargetActor 로 설정한다.
CalculateAngleFromCamera : 카메라와 Targetactor 의 위치를 이용해 회전 값을 만들고 플레이어와 회전 값 차를 구해 캐릭터가 가장 가깝게 바라볼수있는 상대를 찾게 도와준다.
특징 2
UBaseCombatComponent::LockOnTarget() : 타겟팅 되었을 때 SpringArm 을 GameMode 에 Attach
UBaseCombatComponent::DisableLockOn() : 타겟팅 해제 시 SpringArm 을 다시 캐릭터에게 Attach.
CameraManagerComponent :
특징 1)
ControlRotation 을 TargetActor 의 방향으로 회전.
특징 2)
Targeting 시 카메라 움직임 제어
1. 스크린 좌표의 특정 영역 안에 Player 가 존재하는지 확인
2. 영역 밖이라면 Lerp 를 이용해 카메라 Moving