Make Unreal REAL.
article thumbnail
Unreal Engine 5 C++ Multiplayer Shooter

 

누군가 호스팅 중인 세션에 참가했다.

 

 

호스팅 중인 세션에 참가했는데 방장이 나가버려 방이 폭파되면, 남은 플레이어들은 이전 레벨로 강제로 다시 이동하게 된다.

 

 

이때 방장이 세션을 파괴하지 않고 나갔다면, 플랫폼(Steam)에는 아직 세션이 남아 있는 상태가 된다.

 

의도한 대로라면, 세션이 남아 있을 경우 기존 세션을 파괴하고 바로 새로운 세션을 생성해야 하는데 그렇지 않다.

 

세션이 남아 있을 때 첫 번째로 누른 Host 버튼에서는 실패로 처리되고, 두 번째에는 성공해 새로운 세션을 열 수 있게 된다.

 

 

세션은 호스팅 중인 컴퓨터에 있는 것이 아니라, 플랫폼에 존재하기 때문에 모든 요청은 델리게이트를 통해 처리된다.

 

CreateSession() 함수에서 이미 세션이 존재할 경우 세션 파괴 요청을 하고 바로 다시 세션을 생성하는데, 이 시점은 요청만 갔을 뿐이지 아직 세션이 파괴되지 않은 상태이다.

 

 

이미 세션이 존재할 경우에는 세션 파괴 완료 델리게이트를 통해 새로운 세션을 생성해야 한다.

  • OnDestroySessionComplete() 함수에서 CreateSession() 함수를 호출하기 위한 멤버 변수를 추가한다.
  • bCreateSessionOnDestroy 변수가 필요한 이유는, 세션 생성 시 호출된 세션 파괴와 일반적인 상황에 호출된 세션 파괴를 구분하기 위함이다.

 

 

이미 세션이 존재할 경우, 세션 파괴 완료 후 새로운 세션을 생성하기 위한 변수를 저장한다.


세션 인터페이스에서 세션 파괴 요청을 직접하지 않고, 구현한 DestroySession() 함수를 통해 처리하도록 변경한다.

 


DestroySession() 함수를 구현한다.

 


세션 파괴 완료 후 호출되는 OnDestroySessionComplete() 함수를 구현한다.

 

세션 파괴에 성공했고 이미 세션이 존재해 파괴 후 새로 생성하기 위함이었으면 새로운 세션을 생성한다.

  • 일반적인 세션 파괴 호출이었으면 새로운 세션을 생성하지 않는다.

 


메뉴 위젯 블루프린트에서 간단하게 나가기 버튼을 추가하고 Quit Game 노드를 바인딩한다.

 


HostButtonClicked(), JoinButtonClicked() 함수에서 버튼을 누르면 다시 클릭하지 못하도록 비활성화한다.

 

 

OnCreateSession() 함수에서는 세션 생성 실패 시, Host 버튼을 다시 활성화해 재시도할 수 있도록 한다.

 

OnFindSessions() 함수에서는 검색에 실패했거나 검색 결과가 없을 시, Join 버튼을 다시 활성화해 재시도할 수 있도록 한다.

 

OnJoinSession() 함수에서도 참가 실패 시, Join 버튼을 다시 활성화해 재시도할 수 있도록 한다.

  • 참가 오류는 누군가 세션을 파괴하지 않고 게임을 종료했을 때 발생한다.

 

 

요청에 대한 결과를 받기 전까지는 버튼이 비활성화되어 있는 것을 확인할 수 있고, 이미 세션이 존재할 때도 델리게이트를 통해 세션 파괴 요청을 처리한 후 성공적으로 새로운 세션을 생성했다.

 

profile

Make Unreal REAL.

@diesuki4

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!

검색 태그