[TIL_250317] UE5로 채팅 시스템 만들기(멀티플레이 시스템 공부)

2025. 3. 17. 19:38·Dev./게임 네트워크

2025.03.14 - [Dev./게임 네트워크] - [TIL_250314] 언리얼 네트워크와 객체 통신 이해

 

[TIL_250314] 언리얼 네트워크와 객체 통신 이해

💭회고오늘 학습한 내용은 다음과 같이 3가지로 요약된다...!언리얼 네트워크 기본 개념과 RPC(Remote Procedure Call)→ RPC는 원격 프로시저 호출(함수를 원격으로 실행한다는 의미)이다. 신뢰성이 중

raindrovvv.tistory.com

🗺️마인드맵

📒학습 내용

클라이언트와 서버의 관계

네트워크 구조에서는 크게 두 가지 역할이 있다:

  1. 서버(Host): 게임 세계의 상태를 관리하고 모든 클라이언트에 정보를 전달하는 역할
  2. 클라이언트(Client): 서버로부터 정보를 받아 화면에 표시하고 사용자 입력을 서버로 전송하는 역할

언리얼 엔진의 네트워크 모드

언리얼 엔진에서는 다음과 같은 네트워크 모드를 제공한다:

  1. Standalone: 단일 플레이어 모드
  2. Listen Server: 호스트가 게임을 플레이하면서 동시에 서버 역할도 수행
  3. Dedicated Server: 게임을 플레이하지 않고 서버 역할만 수행
실무 팁: 개발 단계에서는 Listen Server 모드가 테스트에 용이하지만, 실제 서비스 환경에서는 Dedicated Server 모드가 더 안정적이다. 대규모 상용 게임에서는 거의 Dedicated Server를 사용한다. 프로젝트 초기부터 이를 고려하여 네트워크 아키텍처를 설계하는 것이 중요하다.

🛠️ 채팅 시스템 구현을 위한 프로젝트 설정

채팅 서버 FLOW

1. 프로젝트 생성 및 기본 클래스 설정

  1. 새 프로젝트 'LvChat'을 생성.
  2. 'BP_ChatMode' 게임 모드 클래스를 생성(GameModeBase 상속)
  3. 'BP_Controller' 플레이어 컨트롤러 클래스를 생성(PlayerController 상속)
실무 팁: 프로젝트를 시작할 때 명확한 네이밍 컨벤션(이름 짓기 규칙)을 적용하는 것이 중요...! 
예를 들어, 'BP_'는 블루프린트 클래스, 'WBP_'는 위젯 블루프린트, 'S_'는 구조체를 나타내는 등의 
규칙을 정하고 일관되게 적용하면 대규모 프로젝트에서도 파일 관리가 용이해진다.

2. 프로젝트 및 월드 설정 구성

  1. 프로젝트 설정 > 맵 & 모드에서 기본 게임 모드를 'BP_ChatMode'로 설정.
  2. 월드 설정 > Net Mode를 'Listen Server'로 설정.
  3. 플레이어 수를 2명으로 설정.

 ➡️이렇게 설정하면 서버와 클라이언트 역할을 동시에 수행하는 Listen Server 모드로 게임이 실행된다.

3. 레벨 블루프린트 설정

레벨 블루프린트에서는 게임 시작 시 서버인지 클라이언트인지 확인하고 그에 맞는 초기화 작업을 수행한다:

실무 팁: 레벨 블루프린트에서 Is Server 함수를 사용하여 서버와 클라이언트를 구분할 수 있다. 그러나 Listen Server 모드에서는 호스트가 서버와 클라이언트 역할을 동시에 수행하므로, 권한 체크를 통해 중복 실행을 방지해야 한다. 실제 프로젝트에서는 이를 위해 별도의 매니저 클래스를 만들어 관리하는 것이 좋다.

🖥️ UI 구성 - 채팅 창 만들기

1. 위젯 블루프린트 생성

  1. 'Widgets' 폴더를 생성하고 'Widget Blueprint'를 선택하여 'Widget_ChatWindow'를 만든다.
  2. Canvas와 EditableTextBox를 추가하여 채팅 입력창을 구성한다.
  3. EditableTextBox의 'IsVariable' 속성을 활성화하고 'OnTextCommitted' 이벤트 추가한다.


2. 이벤트 디스패처 설정

위젯에서 이벤트 디스패처를 설정하여 채팅 메시지를 PlayerController로 전달한다:

  1. 'Widget_ChatWindow'에 'SetMessageToUserController' 이벤트 디스패처를 추가한다.
  2. String 타입의 매개변수를 추가하여 메시지를 전달할 수 있도록 한다.
  3. 'OnTextCommitted' 이벤트에서 이벤트 디스패처를 호출하고 입력창을 비운다.

실무 팁: 이벤트 디스패처는 서로 다른 블루프린트 간의 통신을 위한 도구...! 특히 UI와 게임 로직을 분리하는 데 유용하다. 이벤트 디스패처에 의미 있는 이름을 부여하고 주석을 통해 용도를 명확히 하는 것이 좋다.
예를 들어, 'OnChatMessageSubmitted' 같은 이름이 'MessageDispatcher'보다 더 명확하다.

3. 이벤트 디스패처 바인딩 방식

이벤트 디스패처를 바인딩하는 두 가지 방식이 있다:

직접 연결(Add event)
이벤트 디스패쳐 바인딩(Create Event)

  1. 직접 연결(Add Event): 같은 블루프린트 내에서 이벤트 디스패처를 호출할 때 사용.
  2. 이벤트 디스패처 바인딩(Create Event): 주로 다른 블루프린트에서 이벤트 디스패처를 호출할 때 사용.

채팅 시스템에서는 위젯에서 발생한 이벤트를 PlayerController로 전달해야 하므로 두 번째 방식을 사용한다.


✅Widget_ChatWindow 블루프린트


🔄 네트워크 통신 구현하기

이제 클라이언트와 서버 간의 통신을 구현하는 방법을 알아보자.

1. PlayerController 구성

PlayerController에서는 채팅 메시지를 서버로 전송하는 로직 구현:

  1. BeginPlay 이벤트에서 'Widget_ChatWindow'를 생성하고 Viewport에 추가. 'RemoteRole' 속성을 확인하여 서버와 클라이언트를 구분...!
  2. 이벤트 디스패처를 바인딩하여 채팅 메시지를 수신.
  3. 'OnSendMsgToServer' 함수를 생성하여 서버로 메시지 전송.

실무 팁: 'RemoteRole'은 네트워크 객체의 복제 역할. 'None'이면 클라이언트, 그렇지 않으면 서버!
이를 활용하여 Listen Server 모드에서 중복 실행을 방지할 수 있다.

2. RPC 함수 구현

Remote Procedure Call(RPC, 원격 프로시저 호출)은 클라이언트와 서버 간의 통신을 위한 핵심 메커니즘.

채팅 시스템에서는 다음과 같은 RPC 함수를 구현:

  1. OnSendMsgToServer: 클라이언트에서 서버로 메시지를 전송하는 함수
  2. GotBroadcast: 서버에서 클라이언트로 메시지를 전송하는 함수

(1)
(2) 'Has Authority' 속성을 사용하여 서버와 클라이언트를 구분

RPC 함수를 구현할 때는 다음 설정을 고려해야 한다:

  • Run on Server: 서버에서 실행되는 함수
  • Run on Client: 클라이언트에서 실행되는 함수
  • Reliable: 메시지 전달을 보장하는 옵션
  • Unreliable: 메시지 전달을 보장하지 않지만 오버헤드가 적은 옵션

채팅 메시지는 중요한 정보이므로 'Reliable' 옵션을 사용하여 메시지 전달을 보장한다.

사용자 ID 관련 노드


✅BP_Controller 블루프린트

🤔 딜레이를 주는 이유?
위젯이 생성되기 전에 동작이 진행될 수 있는 경우를 방지하기 위해...!
➡️ BeginPlay가 순차적으로 제어가 안될 수 있기 때문에 혹시나 위젯이 생성이 안됐거나 뷰포트에 표시되지 않았을 수 있기 때문에 딜레이를 주는 것이다.

3. 게임 모드 설정

BP_ChatMode에서는 메시지 브로드캐스팅 로직을 구현:

  1. ' GotMessageFromClient' 함수 생성.
  2. 모든 PlayerController를 가져와서 'GotBroadcast' 함수 호출.

✅BP_ChatMode 블루프린트

✨게임 모드는 서버에서만 실행되므로, 클라이언트에서는 직접 접근할 수 없다. 따라서 PlayerController를 통해 게임 모드의 함수를 호출해야 한다. 이는 언리얼 엔진의 네트워크 아키텍처에서 중요한 원칙이다.

🔍 채팅 시스템 작동 원리 상세 분석

  1. 사용자가 메시지를 입력하고 엔터.
  2. 'Widget_ChatWindow'의 'OnTextCommitted' 이벤트가 발생.
  3. 이벤트 디스패처를 통해 PlayerController로 메시지 전달.
  4. PlayerController는 'ServerSendMessage관련' RPC를 호출하여 메시지를 서버로 전송.
  5. 서버는 'BroadcastMessage관련' 함수를 호출하여 모든 클라이언트에게 메시지를 브로드캐스팅.
  6. 각 클라이언트는 '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
'Dev./게임 네트워크' 카테고리의 다른 글
  • 🌠UE5 채팅 시스템 내용 보완
  • [TIL_250318] 언리얼 C++로 BluePrint 라이브러리 추가
  • [TIL_250314] 언리얼 네트워크와 객체 통신 이해
  • [TIL_250313_1] 언리얼 소스 코드 빌드하기
raindrovvv
raindrovvv
raindrovvv 님의 블로그 입니다.
  • raindrovvv
    raindrovvv 님의 블로그
    raindrovvv
  • 전체
    오늘
    어제
    • 분류 전체보기 (102) N
      • Dev. (95) N
        • UE 언리얼 엔진 (49)
        • Unity 유니티 (0)
        • Wwise 와이즈 (7)
        • 게임 네트워크 (8)
        • 그래픽스 Graphics (22)
        • 프로젝트 (5) N
        • 기타 개발 관련 (4)
      • Computer Science (0)
        • 하드웨어 HW (0)
        • 소프트웨어 SW (0)
        • 통신 (0)
        • 데이터 (0)
      • 블로그 (3)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    그래픽스
    네트워크
    머티리얼
    unrealengine
    게임음향
    게임
    게임네트워크
    Git
    AI
    언리얼
    Unreal
    게임개발
    셰이더
    고라니
    게임사운드
    깃
    Wwise
    언리얼엔진
    UE
    TA
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
raindrovvv
[TIL_250317] UE5로 채팅 시스템 만들기(멀티플레이 시스템 공부)
상단으로

티스토리툴바