저번 시간에는 무기의 Equip/Unequip을 구현하였고 이번엔 총 게임의 핵심인 Aim 기능을 구현하였다.
사실 핵심적인 기능은 블루프린트의 활(Bow)의 Aim 기능을 구현했던 것과 비슷하게 구현된다. 살짝 다른점이 있다면 총은 Aiming 중에 흔들리지 않아야 한다(?)는 것이다.
📚 InputEvent

Player 클래스에서 마우스 오른쪽 키를 누르면 Aiming 입력이 실행되도록 하였다.
📚 Begin_Aim, End_Aim

Weapon Component의 Begin_Aim 함수가 호출될 때 현재 무기가 있는지와 Aim 모드가 될 수 있는 상태인지를 검사하였다. Can Aim 함수에서는 bEquipping 과, bReload, bInAim 까지 총 3가지 bool 변수를 검사하며 모든 경우가 아닐때에만 Aim 상태로 변환될 수 있도록 하였다.
이후 GetCurrentWeapon()->Begin_Aim() / End_Aim() 함수를 호출하며 현재 장착중인 무기인 Weapon 클래스의 함수를 호출하였다.

Weapon 클래스에서는 Begin Aim과 End Aim 함수가 호출될 때 Aim Data/BaseData라는 변수를 변경시킨다.
이들은 Weapon 클래스에 생성해둔 FWeaponAimData 구조체의 정보를 저장하는 변수들이다.
📚 FWeaponAimData
![]() |
![]() |
Aim 상태인 경우와, 아닌 경우를 각각 Aim Data와 Base Data로 설정하기 위해 두 개의 변수를 선언하였고, 구조체 안에 TargetArmLength와, SocketOffset, FieldOfView 값을 설정해주었다.
또한 무기의 종류마다 Aim 정도가 다르기 때문에 Weapon 클래스에 선언해둔 변수를 AR4 클래스에서 초기화 해 주었다.
📚 Curve, Timeline

추가적으로, Aim 모드와 일반 모드 사이가 변환될 때 자연스러운 카메라 이동을 구현하기 위해 엔진 에디터에서 Aim Curve를 생성해주었고,

해당 Curve를 C++ 클래스에 가져와서 UCurveFloat* AimCurve 변수에 저장한 뒤, 타임라인 객체에 초기화 해 주었다.


블루프린트에서는 타임라인 함수를 호출하여 커브를 적용했는데, C++ 클래스에서는 타임라인을 사용할 수 있는 Timeline Component가 존재하므로 해당 컴포넌트를 이용하여 타임라인을 구현해보았다.
FOnTimelineFloat 객체를 생성하여 On Aiming 함수를 바인딩해놓고, Timeline Component에 만들어두었던 Curve와 함수를 할당한 객체를 AddInterpFloat 함수로 전달해주었다.

따라서 Timeline의 PlayFromStart(), ReverseFromEnd() 함수가 호출될 때마다 OnAiming 함수가 호출되며 Aim 기능이 작동된다.

