지금 현재 진행하고 있는 프로젝트에서 Note Actor를 클릭하고 레이드를 선택할 수 있는 기능을 만들어보고자 하였다.
이를 위해 월드 상에 존재하고 있는 Actor를 마우스로 클릭할 수 있게 해서 Menu를 띄워보고자 한다.
시작하기에 앞서
일단 사용할 RequestBoard라는 블루프린트 액터를 생성하였다.
이 액터 자체에는 각각의 Note들이 달려있는데 플레이어가 클릭할 때 이 것들을 클릭할 수 있게 할 것이다.
이 것들은 현재 글에서는 설명하지 않기 때문에 생략하도록 하겠다.
RequestBoard에다가 상호작용을 하면, CloseUp을 진행할 수 있도록 Blueprint를 구성해보겠다.
블루프린트 구성 - CloseUp을 하기 전 카메라 셋팅
상호작용 하여 Event가 실행되면, 캐릭터 카메라의 Look Input을 비활성화하여 카메라가 움직이기 않게 설정해주고, CameraActor를 스폰시킨다.
이 CameraActor는 Character가 소유할 수 있게 해준다.
스폰한 CameraActor를 기억하기 위해 RequesBoardCamera라는 변수로 지정해주고 양옆 또는 위 아래에 검정색으로 짤려서 표시되는 것을 방지하기 위해 Set Constraint Aspect Ratio로 종횡비 설정을 해제해준다.
또한 기존 캐릭터의 카메라 위치를 받아와서 시작 지점과 시작 회전값을 변수로 저장해주었다.
스폰한 RequesBoardCamera에 아까 지정해준 시작 지점과 시작 회전값을 넣어주고 View Target을 그 카메라로 지정해준다.
RequestBoard Actor의 크기를 받아서 그 Actor 전부를 보여줄 수 있는 위치를 계산한 후 (이는 그 액터의 크기에 따라 계산값이 달라질 수 있음) Target위치를 저장해준다.
또한 실제 월드상에서 카메라를 이동시키는 것이기 때문에 그 액터를 전부 보여주기 위해서 캐릭터의 메시를 CloseUp이벤트를 수행할 때 안보이게 Set Visible Scene Capture Only로 보이지 않게 만들어준다.
OnCloseUp 변수를 True로 지정해주고, Tick에서 OnCloseUp 변수에 맞춰 노드로 만들어준 CloseUp 작업을 수행하도록 하였다.
블루프린트 구성 - CloseUp 작업
CloseUp 작업 안에서는 RequestBoardCamera의 위치를 받아 TargetLocation과의 위치를 비교해 거의 일치할 때까지 확인하게 된다.
Branch로 확인했을 때 아직 맞는 위치에 도달하지 않았을 때엔 False가 계속 반환되고, 아래의 블럭들이 실행되게 된다.
카메라 시작지점과 도착지점과의 거리, Distance를 구한 뒤 월드의 DeltaSeconds와 곱해 값을 만든다.
이는 원하는 시간만큼 이동하기 위해서 계산하는 것이다. 필자는 1초를 기준으로 했기 때문에 DeltaSeconds와 곱하는 과정만 진행하였지만, 만약 1초가 아닌 시간만큼 이동하고 싶다면 [ / (나누기) 시간 ] 만큼을 다시 진행해줘야 한다.
이를 Clamp로 하여 가장 적은 속도는 5, 큰 속도는 20으로 기준점을 정해준다.
구해진 값을 속도(Interp Speed)로 지정해주고, 현재 생성되어 있는 카메라의 위치와 도착 지점의 위치를 각각 Current, Target으로 지정해준다.
마찬가지로 Rotation도 지정해준다. 더 정확한 계산을 해서 맞출수도 있지만, Speed는 바로 RequestBoard의 앞을 바라보게 설정하는 것이 더 이상적일 것 같아 10으로 지정하였다.
이 값들을 Set Actor Location And Rotation 노드를 이용하여 생성되어 있는 카메라의 위치와 회전값을 변화시켜 주었다.
이 작업이 완료된다면 Set노드를 이용하여 OnCloseUp 값을 False로 지정하여 Tick에서 더 이상 이 CloseUp작업을 실행하지 않도록 설정하였다.
결과
클로즈업 이벤트가 잘 구현되는 것을 볼 수 있다.
'UnrealEngine > 공부' 카테고리의 다른 글
[Unreal Engine C++] Dash의 기능에서 개선된 Dodge의 구현 (0) | 2024.08.21 |
---|---|
[Unreal Engine C++] Widget Blueprint를 이용해 세션 생성 및 접속 기능 만들기 (0) | 2024.08.15 |
[GitLab] SourceTree를 활용해 팀 프로젝트 진행해보기 (0) | 2024.08.04 |
[Unreal Engine C++] C++에서 Niagara System 스폰 (1) | 2024.05.29 |
[Unreal Engine C++] Online Subsystem을 활용한 멀티플레이 구현 (1) | 2024.04.20 |
CSE & GAME 개발 블로그
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 부탁드립니다!