본문 바로가기
언리얼_엔진_게임개발_공부/언리얼 네트워크

데디케이티드 서버 활용 미로 게임 예제 분석

by jaboy 2025. 3. 18.

강의에서 데디케이티드 서버를 빌드해 에디터에서 접속할 수 있는 미로 게임을 예제로 다루었다.

이 예제가 어떤 요소들로, 어떻게 서버/클라이언트의 로직이 구성되어 있는지 정리해보았다.

 

구성 & 역할 (게임플레이 프레임워크 순서대로)

  1. 게임 인스턴스
    : 고유 ID 저장 / 별도 기능 없음
  2. 접속 레벨 & 게임 모드
    : 클라이언트-서버 연결 트래킹 / 게임플레이 레벨 전환
  3. 트랜지션 레벨 (TransitionMap)
    : Seamless Travel 위한 중간 레벨 / 별도 기능 없음
  4. 게임플레이 레벨 & 게임 모드
    : 게임 로직 수행 / 승패 판단 / 게임 종료
  5. 플레이어 컨트롤러 & 캐릭터
    : 클라이언트 (i.e. 위젯) - 서버 연동
  6. 액터 (벽, 바닥, Goal 등)
    : Goal - 충돌 감지하여 게임 종료 호출
  7. 메인 메뉴 위젯
    : 접속 버튼 / 게임 승자 어나운스

 

접속 레벨 (ConnectMap)

  • BeginPlay 시 메인 메뉴 위젯 생성 & add to viewport
  • BP_ConnectGM 게임 모드 생성 (i.e. 월드 세팅에서 지정)

접속 게임 모드 (BP_ConnectGM)

  • OnPostLogin 이벤트 (엔진 함수 오버라이드)
    - 호출 시점 : 플레이어 접속 후 컨트롤러 assign 완료
    - 수행 내용
      0. IsServer == true ?
      1. 접속한 플레이어 수 트래킹
        * integer 타입의 replicated 변수 "Players"
      2. (딜레이 후) 플레이어 수가 2 이상이면 게임 플레이 레벨로 travel 함수 호출 (OpenMazeMap)
  • OpenMazeMap 커스텀 이벤트
    - Replicates : Multicast
    - 수행 내용
     0. IsServer == true ?
     1. Use Seamless Travel 활성화
     2. Execute Console Command - "servertravel MazeMap"

메인 메뉴 위젯

  • Connect 버튼 클릭 시
    0. bool 변수로 더블 클릭 방지 (1회만 실행되도록)
    1. OpenLevel - 127.0.0.1
      * 로컬 호스트 IP 주소 - 내 PC의 서버로 접속


게임 플레이 레벨 (MazeMap)

  • BP_GM 게임 모드 생성

게임플레이 게임 모드 (BP_GM)

  • BeginPlay 시 미로 생성 C++ & BP 함수 호출
    • 해당 함수가 Wall, Floor, Goal 액터 생성 및 배치
    • c.f. 위의 액터들은 replicate 별도로 지정 필요
  • EndGame 커스텀 이벤트
    - Replicates: Run on server
    - Input : Winner ID (String)
    - 수행 내용
    1. Get All Actors of Class - BP_Controller
    2. BP_Controller 의 OnEndOfGame 호출

 

타겟 액터 (Goal)

  • OnComponentHit 시 게임 종료 함수 호출
    - 수행 내용
    0. bool 변수로 여러 번 호출 방지
    1. Other Actor - Character 캐스팅 체크 & GetPlayerController - BP_Controller 캐스팅 체크
    2. Get Game Instance - BP_GI 캐스팅 - Player Name 가져오기
    3. Get Game Mode - BP_GM 캐스팅 - EndGame 호출

 

플레이어 컨트롤러 (BP_Controller)

  • OnEndOfGame 커스텀 이벤트
    - Replicates: Run on owning client
    - Input : Winner ID (String)
    - 수행 내용:
    0. 결과 위젯 생성
    1. 해당 위젯의 OnEndGame 함수 호출
    2. 뷰포트 추가

 

결과 위젯

  • OnEndGame 커스텀 이벤트
    - Input: UserID (String)
    - 수행 내용
    0. UserID - Append "WON!"
    1. 텍스트 블록에 SetText

 

Replicates 게임 모드 플레이어 컨트롤러
Run on server
(client --> server)
- EndGame
: 모든 컨트롤러에 OnEndOfGame 함수 호출
 
Run on owning client
(server --> client)
  - OnEndOfGame
: 게임 결과 표시하는 위젯 추가
Multicast
(server --> all clients)
- OpenMazeMap
: 새로운 레벨로 seamless travel
 
Does not replicate - (접속) OnPostLogin
: Replicate 된 변수 Players++ & 조건 체크 후 멀티캐스트 함수 OpenMazeMap 호출
- (게임플레이) BeginPlay
: Replicate 지정된 액터 스폰
 
Replicate 변수 - Players (int) : 접속한 플레이어의 수  

 

+) 위젯 - replicate 불가

 

위와 같이 정리해보면

 

1. 게임 모드 (server-side) 에서 replicate 되지 않는 함수의 경우,

변수를 replicate 지정하거나 replicate 된 별도의 함수를 호출하여 서버-클라이언트 동기화

 

2. 플레이어 컨트롤러에서 위젯을 제어하는 함수의 경우,

서버에서 클라이언트로 replicate (i.e. Run on owning client) 지정하여 각 클라이언트에 위젯 표시


강의를 따라가면서 보았을 때에는 조금 혼란스러웠는데,

위와 같이 정리해보니 어떤 로직이 서버에서 실행되고 어떤 로직이 클라이언트에서 실행되는지 조금은 더 정리가 되는 듯 하다.