5. 멀티플레이 개발
지난번에 Dedicated server 개발용 언리얼 엔진을 다운받고 많은 일이 있었다.
우선 깃허브 엔진과 에픽게임즈 런처 엔진이 달라 원래 개발하던 프로젝트가 죽었었다.
여러 방법을 시도해봤지만 안됬었는데, 중간에 비주얼 스튜디오 업데이트를 하면서 더 꼬였었다.
결국 깃허브에서 엔진 재설치를 하고 프로젝트 임시 파일을 싹 날린다음 .uproject 파일에서 Generate project file을 하고 클린 프로젝트 -> Rebuild를 하니 살릴 수 있었다.
엔진의 빌드가 8시간 넘게 걸려 새로 빌드를 해보는 날엔 거의 하루를 날렸었는데, 고치는동안 빌드를 너무 많이 시도해 날린 많은 시간들이 아깝다..
그다음 세션 생성 및 참가를 위해 로직을 작성했는데 처음에는 GameMode 클래스에 모든 로직을 작성했었다.
근데 서버 - 클라이언트 동작이 GameMode 클래스에서 동작하지 않아 PlayerController로 로직을 일부 옮겨 멀티플레이의 핵심인 세션 생성 및 세션 검색, 세션 참가를 GameMode 클래스에서 동작하도록 하고, PlayerController 클래스에서 각 플레이어가 서버에 해당하는 동작을 요청하도록 변경하였다.
세션 관리는 따로 GameMode 클래스가 서버에 단 하나만 존재한다고 생각해 SessionInfo 구조체에 세션 이름, 맵 이름, 현재인원수, 최대인원수, 세션 UID를 저장하는 방식으로 설계하고 OnlineSubsystem이 세션을 생성할 때 FName 타입으로 UID를 지정해서 추후 세션 참가시 세션 UID를 참고하여 접속할 수 있도록 구성했었다.
하지만 PIE 테스트 특성 때문인지 GameMode 클래스에서 TMap 타입 ActiveSession을 UID-SessionInfo 조합으로 선언했는데, 인스턴스 마다 ActiveSession을 새로 생성해서 참조하는 일이 발생했다.
이것을 해결하기 위해 여러 방법을 시도해봤지만, 최종적으로 GameInstance 클래스에 ActiveSession TMap을 옮기고 관리하도록 구성한 다음, GameInstance를 싱글톤 형식으로 다른 클래스들에서 참조하도록 하니 ActiveSession의 일관성이 유지되었다.
그다음 Widget Blueprint로 UI를 구성하고 C++로 구성해놓은 세션 관련 함수들을 바인딩 해서 테스트 해보았다.
Create Session은 현재 처음 엔진을 가동하고 나서 첫 동작시 정상적으로 레벨 이동이 되지 않고 메인 UI로 튕겨져나오는 현상이 발생하고 있다. 그거 제외하고는 잘 동작하고 있다.
Join Session이 가장 말썽이 많았다.
SessionList의 각 세션마다 Horizontal Box를 생성해서 Join Session UI의 Scroll Box에 들어가도록 설계했다.
블루프린트도 디자이너쪽에서 사용하기 좋다는 말을 봐서 UI를 모두 Widget Blueprint로 생성하고 블루프린트로 동작을 구성했다.
Event Construct 노드를 사용해 처음 세션 검색을 하도록 하고, Refresh버튼의 클릭 이벤트가 발생하면 세션 리스트를 새로고침 하도록 했다. 세션 리스트 중 하나를 클릭하면 SessionList Widget BP에 담겨있는 Session UID를 참고해 세션에 참가하도록 설계했다.
하지만 Scroll Box 내부에 세션 리스트가 겹쳐서 생성되거나, 클릭이 안되거나 하는 여러 문제가 생겼었다.
대부분 해결했지만 현재 해결해야할 문제는 다음과 같다.
1. SessionList 내부 UID를 사용해 세션 참가 요청을 보내지만 일치하는 UID가 없다고 세션에 참가하지 못하는 문제
2. 클릭한 UI에 강조표시가 나타나지 않는 문제
3. 세션 리스트 중 하나를 클릭하고, 다른 세션을 클릭했을 때 선택된 세션의 정보로 데이터가 바뀌지 않는 문제
빨리 해결해야 한다..
'개발 일지' 카테고리의 다른 글
7. 온라인세션? 쉽지않다 (0) | 2024.11.12 |
---|---|
6. UMG 디자인 (0) | 2024.11.09 |
4. 서버 구축을 위한 삽질 (0) | 2024.09.02 |
3. 플레이어 랜덤 스폰 구현 (0) | 2024.08.31 |
2. 움직이는 플레이어 캐릭터 만들기 (0) | 2024.08.26 |