멈추지 않고 끈질기게

[포트폴리오] 언리얼 팀 프로젝트 회고(3차) 본문

포트폴리오

[포트폴리오] 언리얼 팀 프로젝트 회고(3차)

sam0308 2024. 7. 4. 10:14

※ 해당 포스팅은 개인의 공부 정리용 글입니다. 틀린 내용이 있다면 추후 수정될 수 있습니다.

 

※ 해당 포스팅은 청년취업사관학교 교육과정 중에 진행한 언리얼 팀 프로젝트에 관한 회고록입니다. 

 

※ 해당 포스팅은 Unreal 5.3.1 버전을 기준으로 작성되었습니다.

 

 

 

1. 프로젝트 소개

 3차 프로젝트는 Portal2의 2인 협동 플레이를 카피캣한 모작 프로젝트입니다. 언리얼의 네트워크 시스템을 적용해보는 것이 핵심 과제였기 때문에, 콘텐츠 볼륨 보다는 네트워크 플레이가 유의미하게 들어가는 게임으로 선정하였습니다. 2인 팀으로 진행하였으며, 저는 플레이어와 포탈 시스템, 그리고 네트워크 세션 연결을 담당하였습니다. 

 

 플레이어는 기본적인 이동 및 점프를 제외하면 큐브 잡기 기능과 포탈 생성 위주로 구현하였습니다. 원작과 최대한 비슷하게 만들기 위해 포탈은 각각 고유의 색상을 가지고 있고, 포탈이 연결되지 않은 상태에서는 디폴트 머티리얼을 보여주다가 연결되는 순간 서로 연결된 포탈 너머를 보여주도록 구현했습니다. 또한 원작의 중요한 기믹인 포탈 입장 시 가속도를 출구 방향으로 변환하는 로직도 구현하였습니다.

 

 네트워크 협동 플레이를 위해 주요 로직들은 RPC로 동기화 처리하였으며, 원작의 협동 플레이에도 있는 다른 플레이어의 포탈을 덮어 씌우는 기능과 의사소통을 위한 포탈 생성 요청 및 감정표현 기능도 구현하였습니다.

사진 1. 포탈 생성 요청 기능(핑 찍기)

 

 

 해당 프로젝트 깃허브 주소 및 소개 영상 주소입니다.

https://github.com/pkh0308/BeyondPortal

 

GitHub - pkh0308/BeyondPortal: 3rd Team Project

3rd Team Project. Contribute to pkh0308/BeyondPortal development by creating an account on GitHub.

github.com

https://youtu.be/Vs_VvnCsDNQ

 

 

 

2. 잘된 점 

 게임의 핵심 기능인 포탈을 구현하면서 꼭 구현하고자 한 기능 2가지가 있는데, 바로 1.포탈에서 연결된 포탈의 너머를 보여주는 기능2.포탈 입장 시의 속도를 빠져나오는 포탈의 방향으로 변환하는 기능이었습니다. 1번의 경우 각 포탈에 SceneCaptureComponent를 추가하고, 해당 카메라가 촬영한 RenderTarget을 반대편 포탈의 머티리얼에 사용하는 방식을 구현했습니다. 한마디로 1번 포탈에 달린 카메라가 촬영한 텍스쳐는 2번 포탈의 머티리얼에, 2번 포탈에 달린 카메라가 촬영한 텍스처는 1번 포탈의 머티리얼에 사용하여 서로 반대편을 보여주도록 했습니다. 

사진 2. SceneCaptureComponent 를 이용한 포탈 건너편 투영

 

 특히 2번 기능의 경우 원작에서도 자주 사용된 중력 가속도를 이용한 롱 점프 기믹과 연관이 있어서 중요하게 여겼는데, 다행히 CharacterMovementComponent의 Velocity를 직접 수정하는 방식으로 생각보다는 쉽게 구현할 수 있었습니다. 다만 네트워크 플레이 시 약간의 딜레이때문에 바닥에 충돌하고 나서 이동하는 이슈가 가끔 발생하여, 콜리전을 약간 포탈 앞 방향으로 당기는 정도의 수정을 거쳤습니다. 
(참고 영상 2:56 ~ 2:59초 참조)

 

 그리고 네트워크 동기화 처리를 작업하는 동안 2명이서 플레이하는 데 포탈이 3개까지 생성되는 등 우여곡절을 많이 겪었지만, 결국 모두 수정하여 최종 발표 때 세션 입장을 통한 2인 플레이를 시연할 수 있었습니다. 큐브의 경우 Simulate Physics 옵션을 켜야 해서 많이 움직이다 보면 동기화가 살짝 맞지 않는 이슈가 보이기도 했으나, 핵심인 포탈 쪽에서는 다행히 그런 이슈가 나오지 않았습니다. 

 

 

3. 아쉬운 점

 다만 원작의 포탈 기능을 완벽하게 구현하지는 못했다는 점이 다소 아쉬웠습니다. 원작의 경우 포탈에 반쯤 걸쳐서 현재 위치와 포탈 건너편을 둘러보는 것까지 가능했는데, 제가 구현한 포탈은 단순히 콜리전에 닿으면 연결된 포탈 위치로 이동하는 방식이라 해당 기능까지 완벽하게 구현하지는 못했습니다. 워낙 유명한 작품이라 레퍼런스 자체는 많았는데, 포탈 중간에 걸치는 부분까지 재현한 레퍼런스는 찾지 못해서 스스로도 고민해 보았으나 아쉽게도 마땅한 방법을 찾지 못했습니다.

사진 3. 포탈에 반쯤 걸쳐있는 큐브(원작)

 

 그리고 마지막에 네트워크 플레이에 신경쓰느라 QA를 제대로 못했는데, 생각보다 프레임 드랍이 있었습니다. 처음엔 네트워크와 연관된 이슈로 의심하여 네트워크 이슈를 해결하는 데 집중했었는데, 발표가 끝나고 나서 테스트해보니 네트워크와는 상관 없이 싱글 플레이에서도 프레임이 다소 떨어지고 있었습니다. 다만 원인 자체는 금방 찾을 수 있었는데, 2차 프로젝트 때 경험한 조명 관련 이슈였습니다. 레벨에 배치된 추가 조명들의 Attenuation Radius를 조절함으로써 60프레임에 가까운 프레임율을 유지할 수 있었습니다.

 

 

 

4. 소감

 언리얼에서 네트워크를 사용하는 프로젝트를 개발하는 것은 처음이라 걱정이 많이 앞섰으나, 다행히 수업때 배운 내용들을 찬찬히 되짚어 보면서 세션 연결을 통한 플레이까지 성공하여 뿌듯했습니다. 이전에 유니티에서 네트워크 프로젝트를 개발할 때는 포톤 서버를 사용하였는데, 그 때는 Dedicated Server가 따로 있는 방식이라 클라에서 RPC를 사용하는 방식만 익혔었습니다. 그런데 언리얼의 리슨 서버 방식에서는 서버쪽이 따로 있다 보니 처음에 좀 어려웠는데, 그래도 익숙해지고 나니 네트워크의 동기화 방식에 대해 한층 더 이해할 수 있게 된 것 같습니다.

사진 4. 세션 입장 후 ServerTravel을 이용한 게임 시작

 

 또한 퍼즐류 게임이라 맵 기믹이 잘 짜여져있어야하는데, 레벨 디자인을 담당하신 팀원 분께서 원작에 가깝게 레벨을 너무 잘 만들어주셔서 플레이하는 재미도 있고 보여주기도 좋은 프로젝트가 되었습니다. 덕분에 최종 발표 후 투표에서 1위를 달성하며 경품으로 외장하드까지 받는 쾌거를 이룩했습니다. 항상 좋은 팀원분을 만나는 걸 보니 제가 나름 인복(人福)은 있는가 봅니다.

사진 5. 투표 1위 경품(외장하드 2TB)