2025.03.14 - [Dev./게임 네트워크] - [TIL_250314] 언리얼 네트워크와 객체 통신 이해
[TIL_250314] 언리얼 네트워크와 객체 통신 이해
💭회고오늘 학습한 내용은 다음과 같이 3가지로 요약된다...!언리얼 네트워크 기본 개념과 RPC(Remote Procedure Call)→ RPC는 원격 프로시저 호출(함수를 원격으로 실행한다는 의미)이다. 신뢰성이 중
raindrovvv.tistory.com
🗺️마인드맵
📒학습 내용
클라이언트와 서버의 관계
네트워크 구조에서는 크게 두 가지 역할이 있다:
- 서버(Host): 게임 세계의 상태를 관리하고 모든 클라이언트에 정보를 전달하는 역할
- 클라이언트(Client): 서버로부터 정보를 받아 화면에 표시하고 사용자 입력을 서버로 전송하는 역할
언리얼 엔진의 네트워크 모드
언리얼 엔진에서는 다음과 같은 네트워크 모드를 제공한다:
- Standalone: 단일 플레이어 모드
- Listen Server: 호스트가 게임을 플레이하면서 동시에 서버 역할도 수행
- Dedicated Server: 게임을 플레이하지 않고 서버 역할만 수행
실무 팁: 개발 단계에서는 Listen Server 모드가 테스트에 용이하지만, 실제 서비스 환경에서는 Dedicated Server 모드가 더 안정적이다. 대규모 상용 게임에서는 거의 Dedicated Server를 사용한다. 프로젝트 초기부터 이를 고려하여 네트워크 아키텍처를 설계하는 것이 중요하다.
🛠️ 채팅 시스템 구현을 위한 프로젝트 설정
1. 프로젝트 생성 및 기본 클래스 설정
- 새 프로젝트 'LvChat'을 생성.
- 'BP_ChatMode' 게임 모드 클래스를 생성(GameModeBase 상속)
- 'BP_Controller' 플레이어 컨트롤러 클래스를 생성(PlayerController 상속)
실무 팁: 프로젝트를 시작할 때 명확한 네이밍 컨벤션(이름 짓기 규칙)을 적용하는 것이 중요...!
예를 들어, 'BP_'는 블루프린트 클래스, 'WBP_'는 위젯 블루프린트, 'S_'는 구조체를 나타내는 등의
규칙을 정하고 일관되게 적용하면 대규모 프로젝트에서도 파일 관리가 용이해진다.
2. 프로젝트 및 월드 설정 구성
- 프로젝트 설정 > 맵 & 모드에서 기본 게임 모드를 'BP_ChatMode'로 설정.
- 월드 설정 > Net Mode를 'Listen Server'로 설정.
- 플레이어 수를 2명으로 설정.
➡️이렇게 설정하면 서버와 클라이언트 역할을 동시에 수행하는 Listen Server 모드로 게임이 실행된다.
3. 레벨 블루프린트 설정
레벨 블루프린트에서는 게임 시작 시 서버인지 클라이언트인지 확인하고 그에 맞는 초기화 작업을 수행한다:
실무 팁: 레벨 블루프린트에서 Is Server 함수를 사용하여 서버와 클라이언트를 구분할 수 있다. 그러나 Listen Server 모드에서는 호스트가 서버와 클라이언트 역할을 동시에 수행하므로, 권한 체크를 통해 중복 실행을 방지해야 한다. 실제 프로젝트에서는 이를 위해 별도의 매니저 클래스를 만들어 관리하는 것이 좋다.
🖥️ UI 구성 - 채팅 창 만들기
1. 위젯 블루프린트 생성
- 'Widgets' 폴더를 생성하고 'Widget Blueprint'를 선택하여 'Widget_ChatWindow'를 만든다.
- Canvas와 EditableTextBox를 추가하여 채팅 입력창을 구성한다.
- EditableTextBox의 'IsVariable' 속성을 활성화하고 'OnTextCommitted' 이벤트 추가한다.
2. 이벤트 디스패처 설정
위젯에서 이벤트 디스패처를 설정하여 채팅 메시지를 PlayerController로 전달한다:
- 'Widget_ChatWindow'에 'SetMessageToUserController' 이벤트 디스패처를 추가한다.
- String 타입의 매개변수를 추가하여 메시지를 전달할 수 있도록 한다.
- 'OnTextCommitted' 이벤트에서 이벤트 디스패처를 호출하고 입력창을 비운다.
실무 팁: 이벤트 디스패처는 서로 다른 블루프린트 간의 통신을 위한 도구...! 특히 UI와 게임 로직을 분리하는 데 유용하다. 이벤트 디스패처에 의미 있는 이름을 부여하고 주석을 통해 용도를 명확히 하는 것이 좋다.
예를 들어, 'OnChatMessageSubmitted' 같은 이름이 'MessageDispatcher'보다 더 명확하다.
3. 이벤트 디스패처 바인딩 방식
이벤트 디스패처를 바인딩하는 두 가지 방식이 있다:
- 직접 연결(Add Event): 같은 블루프린트 내에서 이벤트 디스패처를 호출할 때 사용.
- 이벤트 디스패처 바인딩(Create Event): 주로 다른 블루프린트에서 이벤트 디스패처를 호출할 때 사용.
채팅 시스템에서는 위젯에서 발생한 이벤트를 PlayerController로 전달해야 하므로 두 번째 방식을 사용한다.
✅Widget_ChatWindow 블루프린트
🔄 네트워크 통신 구현하기
이제 클라이언트와 서버 간의 통신을 구현하는 방법을 알아보자.
1. PlayerController 구성
PlayerController에서는 채팅 메시지를 서버로 전송하는 로직 구현:
- BeginPlay 이벤트에서 'Widget_ChatWindow'를 생성하고 Viewport에 추가. 'RemoteRole' 속성을 확인하여 서버와 클라이언트를 구분...!
- 이벤트 디스패처를 바인딩하여 채팅 메시지를 수신.
- 'OnSendMsgToServer' 함수를 생성하여 서버로 메시지 전송.
실무 팁: 'RemoteRole'은 네트워크 객체의 복제 역할. 'None'이면 클라이언트, 그렇지 않으면 서버!
이를 활용하여 Listen Server 모드에서 중복 실행을 방지할 수 있다.
2. RPC 함수 구현
Remote Procedure Call(RPC, 원격 프로시저 호출)은 클라이언트와 서버 간의 통신을 위한 핵심 메커니즘.
채팅 시스템에서는 다음과 같은 RPC 함수를 구현:
- OnSendMsgToServer: 클라이언트에서 서버로 메시지를 전송하는 함수
- GotBroadcast: 서버에서 클라이언트로 메시지를 전송하는 함수
RPC 함수를 구현할 때는 다음 설정을 고려해야 한다:
- Run on Server: 서버에서 실행되는 함수
- Run on Client: 클라이언트에서 실행되는 함수
- Reliable: 메시지 전달을 보장하는 옵션
- Unreliable: 메시지 전달을 보장하지 않지만 오버헤드가 적은 옵션
채팅 메시지는 중요한 정보이므로 'Reliable' 옵션을 사용하여 메시지 전달을 보장한다.
✅BP_Controller 블루프린트
🤔 딜레이를 주는 이유?
위젯이 생성되기 전에 동작이 진행될 수 있는 경우를 방지하기 위해...!
➡️ BeginPlay가 순차적으로 제어가 안될 수 있기 때문에 혹시나 위젯이 생성이 안됐거나 뷰포트에 표시되지 않았을 수 있기 때문에 딜레이를 주는 것이다.
3. 게임 모드 설정
BP_ChatMode에서는 메시지 브로드캐스팅 로직을 구현:
- ' GotMessageFromClient' 함수 생성.
- 모든 PlayerController를 가져와서 'GotBroadcast' 함수 호출.
✅BP_ChatMode 블루프린트
✨게임 모드는 서버에서만 실행되므로, 클라이언트에서는 직접 접근할 수 없다. 따라서 PlayerController를 통해 게임 모드의 함수를 호출해야 한다. 이는 언리얼 엔진의 네트워크 아키텍처에서 중요한 원칙이다.
🔍 채팅 시스템 작동 원리 상세 분석
- 사용자가 메시지를 입력하고 엔터.
- 'Widget_ChatWindow'의 'OnTextCommitted' 이벤트가 발생.
- 이벤트 디스패처를 통해 PlayerController로 메시지 전달.
- PlayerController는 'ServerSendMessage관련' RPC를 호출하여 메시지를 서버로 전송.
- 서버는 'BroadcastMessage관련' 함수를 호출하여 모든 클라이언트에게 메시지를 브로드캐스팅.
- 각 클라이언트는 'ClientReceiveMessage관련' RPC를 통해 메시지를 수신하고 화면에 표시.
이 과정을 통해 사용자가 입력한 메시지가 모든 클라이언트에게 전달되어 표시된다.
흐름도로 보는 채팅 시스템 구조
➕ 팁: 블루프린트에서 레퍼런스 찾는 법
🟣오늘의 옵시디언 현황
'Dev. > 게임 네트워크' 카테고리의 다른 글
🌠UE5 채팅 시스템 내용 보완 (0) | 2025.03.23 |
---|---|
[TIL_250318] 언리얼 C++로 BluePrint 라이브러리 추가 (0) | 2025.03.18 |
[TIL_250314] 언리얼 네트워크와 객체 통신 이해 (0) | 2025.03.14 |
[TIL_250313_1] 언리얼 소스 코드 빌드하기 (0) | 2025.03.13 |
[TIL_250312] 온라인 게임과 네트워크 구성 이해 (0) | 2025.03.12 |