🎮Unreal4/C++

[UE4] 활(Bow) 장착/해제, Aim 기능 : UCurveFloat, FTimeline, FOnTimelineFloat

공대 컴린이 2023. 6. 14. 16:41
728x90

🏹 활 (Bow) 생성

활(Bow) 무기를 구현하기 위해 CAttachment_Bow 클래스를 작성하였다. 부모인 CAttachment 클래스는 무기의 최상위 클래스이다.

 

활을 쏠 때마다 활시위(string) 부분이 움직여지기 때문에 활 메시는 PoseableMeshComponent 를 이용하여 초기화한다.

 

활 애셋을 이용해 Mesh를 초기화 해 주었고, 무기 장착/해제 시 Socket에 활을 Attach하였다.

 

 

컴파일 후 DataAsset에 Attachment_Bow를 설정하면, 위와 같이 성공적으로 Bow가 붙고, 장착/해제 되는것을 볼 수 있다.

🏹 Bow Aiming 기능

마우스 오른쪽 버튼을 통해 에임을 맞추는 SubAction을 구현해보았다.

에임을 맞추는 상태에서는 카메라가 플레이어쪽으로 확대된다.

 

에임 기능 구현을 위한 SubAction_Aiming 클래스를 생성하였고, 에임 시 변화되는 값들을 FAimData 구조체에 저장해두었다.

 

카메라의 거리를 움직여 확대 및 축소를 구현하므로 SpringArm Camera 객체를 불러오고, 이 객체들의 ArmLength, SocketOffset, CameraLag, Camera Location을 조절하였다.

 

추가적으로, 에임 상태의 속성 값들을 저장하는 AimData와, 에임 상태가 아닌 본래의 속성 값들을 저장하는 OriginData를 선언하여 사용하였다.

 

또한 에임 상태로 카메라가 확대될 때 부드러운 카메라 움직임을 구현하기 위해 UCurveFloat 객체를 이용하여 Timeline을 조절해주었다.

 

BeginPlay 함수가 호출될 때 Owner Character가 가지고 있는 SpringArm과 Camera를 가져오고, FTimeline 클래스에 존재하는 FOnTimelineFloat 델리게이트에 OnAiming 함수를 등록해주었다.

 

SubAction_Aiming 클래스의 부모인 SubAction은 Actor가 아닌 Object를 상속받아 만들었기 때문에 UTimelineComponent를 사용할 수 없다. Timeline Component 없이도 타임라인의 기능을 사용할 수 있도록 FTimeline 클래스TickTimeline함수를 Tick 함수에서 지속적으로 호출하였다.

 

 OnAiming 함수에서는 Camera의 FieldOfView 값을 변경시키도록 float Output 매개변수를 할당해주었다.

 

Curve는 따로 제작하여 레퍼런스를 통해 C++ 클래스에 할당해주었다.

 

SubAction의 Pressed와 Released 함수가 호출될 때 실제 Aiming 기능이 작동되도록 구현하였다.

 

Pressed 함수가 호출되면 FAimData로 선언한 OriginData 변수에 원본 카메라, SpringArm의 속성값을 저장해 놓은 뒤, 에임 모드의 AimData를 SpringArm과 Camera에 초기화시켜 주었다.

Timeline은 PlayFromStart 함수를 호출하여 CameraFieldOfView가 90에서 45로 줄어들어 카메라를 확대시켰다.

 

Released 함수가 호출되면 SpringArm과 Camera를 저장해두었던 OriginData로 다시 돌려놓는다.

Timeline은 ReverseFromEnd 함수를 호출하여 확대됐던 CameraFieldOfView를 거꾸로 축소하였다.

 

프로그램 컴파일 후 CSubAction_Aiming 클래스 기반 블루프린트를 생성하고, Attachment_Bow의 데이터 애셋에 추가해주었다.

 

프로그램 실행 결과, 아래와 같이 Bow 무기의 장착/해제와 Aim 모드가 성공적으로 실행되는것을 볼 수 있었다.

 

728x90