강의에서 데디케이티드 서버를 빌드해 에디터에서 접속할 수 있는 미로 게임을 예제로 다루었다.
이 예제가 어떤 요소들로, 어떻게 서버/클라이언트의 로직이 구성되어 있는지 정리해보았다.
구성 & 역할 (게임플레이 프레임워크 순서대로)
- 게임 인스턴스
: 고유 ID 저장 / 별도 기능 없음 - 접속 레벨 & 게임 모드
: 클라이언트-서버 연결 트래킹 / 게임플레이 레벨 전환 - 트랜지션 레벨 (TransitionMap)
: Seamless Travel 위한 중간 레벨 / 별도 기능 없음 - 게임플레이 레벨 & 게임 모드
: 게임 로직 수행 / 승패 판단 / 게임 종료 - 플레이어 컨트롤러 & 캐릭터
: 클라이언트 (i.e. 위젯) - 서버 연동 - 액터 (벽, 바닥, Goal 등)
: Goal - 충돌 감지하여 게임 종료 호출 - 메인 메뉴 위젯
: 접속 버튼 / 게임 승자 어나운스
접속 레벨 (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) 지정하여 각 클라이언트에 위젯 표시
강의를 따라가면서 보았을 때에는 조금 혼란스러웠는데,
위와 같이 정리해보니 어떤 로직이 서버에서 실행되고 어떤 로직이 클라이언트에서 실행되는지 조금은 더 정리가 되는 듯 하다.
'언리얼_엔진_게임개발_공부 > 언리얼 네트워크' 카테고리의 다른 글
C++ 로 채팅 예제 구현 - ChatWidget ~ GameMode & 유저네임 중복체크 / 색상 랜덤 부여 (0) | 2025.03.20 |
---|---|
C++로 채팅 예제 구현하기 - PlayerController ~ LoginWidget (0) | 2025.03.19 |
Run on server / Run on owning client 잘 구분하여 쓰기 (0) | 2025.03.13 |
언리얼 엔진의 네트워크 / NetMode / Replication (0) | 2025.03.12 |
서버 부하 분산 - 로드 밸런싱 - L4 / L7 스위치 (0) | 2025.03.11 |