프로젝트/H.W.H

Targeting & Camera

__sapar 2024. 10. 16. 20:12

 

코드 - 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

.cpp https://github.com/LCU97/Cat/blob/main/Source/HumanAndCat/Private/Components/CameraManagerComponent.cpp

 

경험과 결과

주요 클래스 및 함수 설명

 

 

 

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