Listen Server와 Dedicated Server의 차이
먼저, Listen Server와 Dedicated Server가 무엇인지 알아본다.
- Listen Server는 서버와 클라이언트가 같은 프로세스에서 실행된다. 호스트 플레이어가 서버 역할을 하면서 동시에 게임을 플레이한다. 즉, 한 명의 플레이어가 게임을 호스팅하며 다른 플레이어가 접속하는 방식이다.
- Dedicated Server는 별도의 서버 프로세스로 실행된다. 플레이어는 클라이언트로 접속해서 게임을 플레이하며, 서버는 오직 게임 상태를 관리하는 역할만 한다. 호스트 플레이어가 게임에 참여하지 않아도 된다.
Listen Server 여는 방법
비주얼 스튜디오와 언리얼 에디터를 사용해서 Listen Server를 연다.
1. 언리얼 에디터에서 프로젝트를 연다.
2. 상단의 '플레이' 버튼을 클릭한다.
3. '멀티플레이어 옵션'을 연다.
- '플레이어 수'를 1로 설정한다.
- '서버로 실행'을 체크한다.
- 설정을 마치고 플레이를 시작하면 Listen Server가 실행된다.
이 방식은 간단하며, 호스트가 직접 게임을 테스트하거나 소규모 플레이에 적합하다.
Dedicated Server 여는 방법
Dedicated Server는 별도의 실행 파일로 빌드해서 실행한다.
1. 언리얼 에디터에서 '파일' 메뉴를 클릭한다.
2. '프로젝트 패키지' > '윈도우' > '윈도우(64비트)'를 선택한다.
3. 프로젝트를 빌드한다.
4. 빌드가 완료되면 'WindowsNoEditor' 폴더가 생성된다.
5. 명령 프롬프트(cmd)를 열고, 해당 폴더로 이동한다.
6. 실행 파일을 '-server' 옵션과 함께 실행한다.
- 예:
MyGame.exe -server
이렇게 하면 Dedicated Server가 실행되며, 클라이언트가 별도로 접속할 수 있다.
네트워크 방식
언리얼 엔진의 네트워크는 클라이언트-서버 모델을 기반으로 한다.
- 서버는 게임의 권위적인 상태를 관리한다. 모든 규칙과 데이터를 결정한다.
- 클라이언트는 서버로부터 데이터를 받아 게임을 렌더링한다.
클라이언트와 서버는 네트워크를 통해 통신하며, 이 통신은 두 가지 방식으로 나뉜다.
Reliable과 Unreliable
- Reliable: 신뢰성 있는 통신이다. 데이터가 반드시 목적지에 도달한다. 중요한 정보에 사용된다.
- Unreliable: 신뢰성이 보장되지 않는다. 데이터가 손실될 수 있지만 속도가 빠르다. 덜 중요한 데이터에 사용된다.
언리얼 엔진에서 멀티플레이어 게임을 개발할 때 네트워크와 관련된 이벤트 그래프의 노드들은 클라이언트와 서버 간의 통신을 관리하고 게임 상태를 동기화하는 데 중요한 역할을 합니다. 아래에서는 주요 네트워크 관련 노드들을 자세히 소개하겠습니다.
RPC (Remote Procedure Call) 노드=
-
Server RPC
- 클라이언트가 서버에 함수를 호출.
- 클라이언트가 서버에 명령을 내리거나 데이터를 보낼 때 사용.
- 예시: 클라이언트가 서버에 플레이어의 이동 명령을 전송.
- 사용법: 블루프린트에서 'Call Server Function' 노드를 사용.
-
Client RPC
- 서버가 특정 클라이언트에 함수를 호출.
- 서버가 클라이언트에게 특정 동작을 지시할 때 사용.
- 예시: 서버가 클라이언트에게 UI 업데이트를 지시.
- 사용법: 블루프린트에서 'Call Client Function' 노드를 사용.
-
NetMulticast RPC
- 서버가 모든 클라이언트에 함수를 호출.
- 모든 클라이언트에게 동일한 동작을 실행할 때 사용.
- 예시: 서버가 모든 클라이언트에 폭발 이펙트를 표시하도록 지시.
- 사용법: 블루프린트에서 'Call Multicast Function' 노드를 사용.
참고: RPC 노드는 Reliable(데이터 전달 보장) 또는 Unreliable(빠르지만 손실 가능)로 설정할 수 있다. 중요한 동작은 Reliable로 설정하는 것이 좋다.
이벤트 노드
네트워크와 관련된 이벤트 노드는 특정 네트워크 상황에서 로직을 실행합니다.
네트워크 관련 유틸리티 노드
네트워크 상태를 확인하거나 서버와 클라이언트 역할을 구분하는 데 사용.
-
Is Server
- 현재 인스턴스가 서버인지 확인.
- 서버 전용 로직을 실행할 때 유용.
- 예시: 서버에서만 오브젝트 스폰.
-
Is Client
- 현재 인스턴스가 클라이언트인지 확인.
- 클라이언트 전용 로직에 사용.
- 예시: 클라이언트에서만 UI 표시.
-
Has Authority
- 현재 액터가 서버에서 권한을 가지고 있는지 확인.
- 서버 전용 로직을 구분할 때 사용.
- 예시: 서버에서만 액터 위치 변경.
-
Switch Has Authority
- 권한에 따라 실행 경로를 나눈다.
- 서버와 클라이언트에서 다른 로직을 실행할 때 유용.
- 예시: 서버는 액터 스폰, 클라이언트는 렌더링.
변수 복제 노드
서버에서 클라이언트로 데이터를 동기화하는 데 사용.
-
Replicated
- 변수가 서버에서 클라이언트로 복제.
- 클라이언트는 읽기만 가능.
- 예시: 플레이어 위치, 체력.
-
RepNotify
- 변수 복제 시 'OnRep' 이벤트가 호출.
- 변수 변경 시 추가 로직을 실행할 수 있다.
- 예시: 체력 변경 시 UI 업데이트.
이벤트 노드
-
Event ActorBeginOverlap
- 액터가 다른 액터와 겹칠 때 호출.
- 서버에서 실행되고 클라이언트에 복제될 수 있다.
- 예시: 서버에서 충돌 감지 후 클라이언트에 이펙트 표시.
-
Event Hit
- 액터가 충돌할 때 호출.
- 서버에서 물리 처리를 하고 클라이언트에 결과 전송.