Unreal Engine 멀티플레이어 게임 개발 2-2
1. WHAT
작성한 채팅 메시지는 일단 서버로 전송
서버는 전송 받은 메세지를 다시 클라이언트들에게 전송

2. HOW
- 채팅 메시지 출력
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/PlayerController.h"
#include "CXPlayerController.generated.h"
class UCXChatInput;
UCLASS()
class CHATX_API ACXPlayerController : public APlayerController
{
GENERATED_BODY()
public:
...
UFUNCTION(Client,Reliable)
void ClientRPCPrintChatMessageString(const FString& InChatMessageString);
UFUNCTION(Server,Reliable)
void ServerRPCPrintChatMessageString(const FString& InChatMessageString);
...
};
#include "Player/CXPlayerController.h"
#include "UI/CXChatInput.h"
#include "Kismet/KismetSystemLibrary.h"
#include "ChatX.h"
#include "EngineUtils.h"
void ACXPlayerController::BeginPlay()
{
Super::BeginPlay();
// 로컬일때만 위젯을 생성해서 보여준다.
if(IsLocalController() == false)
{
return;
}
FInputModeUIOnly InputModeUIOnly;
SetInputMode(InputModeUIOnly);
if (IsValid(ChatInputWidgetClass) == true)
{
ChatInputWidgetInstance=CreateWidget<UCXChatInput>(this, ChatInputWidgetClass);
if (IsValid(ChatInputWidgetInstance) == true)
{
ChatInputWidgetInstance->AddToViewport();
}
}
}
// 1. 클라이언트가 입력
void ACXPlayerController::SetChatMessageString(const FString& InChatMessageString)
{
ChatMessageString = InChatMessageString;
//PrintChatMessageString(ChatMessageString);
if (IsLocalController() == true)
{
ServerRPCPrintChatMessageString(InChatMessageString);
}
}
// 4. 클라이언트 화면에 출력
void ACXPlayerController::PrintChatMessageString(const FString& InChatMessageString)
{
//UKismetSystemLibrary::PrintString(this, InChatMessageString, true, true, FLinearColor::Green, 5.0f);
//FString NetModeString = ChatXFunctionLibrary::GetNetModeString(this);
//FString CombinedMessageString = FString::Printf(TEXT("[%s] %s"), *NetModeString, *InChatMessageString);
//ChatXFunctionLibrary::MyPrintString(this, CombinedMessageString, 10.f);
ChatXFunctionLibrary::MyPrintString(this, InChatMessageString, 10.f);
}
// 2. 서버 RPC 수행. 클라이언트 RPC 호출
void ACXPlayerController::ServerRPCPrintChatMessageString_Implementation(const FString& InChatMessageString)
{
for(TActorIterator<ACXPlayerController> It(GetWorld()); It; ++It)
{
ACXPlayerController* CXPlayerController = *It;
if(IsValid(CXPlayerController) == true)
{
CXPlayerController->ClientRPCPrintChatMessageString(InChatMessageString);
}
}
}
// 3. 클라이언트 RPC 수행
void ACXPlayerController::ClientRPCPrintChatMessageString_Implementation(const FString& InChatMessageString)
{
PrintChatMessageString(InChatMessageString);
}
채팅을 치면 모든 클라이언트 화면에 보이게 된다.
- 접속하면 로그인 알리기
NetMulticast RPC를 통한 서버 접속 알리기 👉Game State
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/GameStateBase.h"
#include "CXGameStateBase.generated.h"
UCLASS()
class CHATX_API ACXGameStateBase : public AGameStateBase
{
GENERATED_BODY()
public:
UFUNCTION(NetMulticast, Reliable)
void MulticastRPCBroadcastLoginMessage(const FString& InNameString = FString(TEXT("XXXXXX")));
};
#include "Game/CXGameStateBase.h"
#include "Kismet/GameplayStatics.h"
#include "Player/CXPlayerController.h"
void ACXGameStateBase::MulticastRPCBroadcastLoginMessage_Implementation(const FString& InNameString)
{
if (HasAuthority() == false) // 서버가 아님
{
APlayerController* PC = UGameplayStatics::GetPlayerController(GetWorld(), 0); // 로컬 컨트롤러
if (IsValid(PC) == true)
{
ACXPlayerController* CXPC = Cast<ACXPlayerController>(PC);
if (IsValid(CXPC) == true)
{
FString NotificationString = InNameString + TEXT(" has joined the game.");
CXPC->PrintChatMessageString(NotificationString);
}
}
}
}
Game Mode에서 OnPostLogin(AController* NewPlayer) 사용
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/GameModeBase.h"
#include "CXGameModeBase.generated.h"
UCLASS()
class CHATX_API ACXGameModeBase : public AGameModeBase
{
GENERATED_BODY()
public:
virtual void OnPostLogin(AController* NewPlayer) override;
};
#include "CXGameModeBase.h"
#include "CXGameStateBase.h"
void ACXGameModeBase::OnPostLogin(AController* NewPlayer)
{
Super::OnPostLogin(NewPlayer);
ACXGameStateBase* CXGameStateBase = GetGameState<ACXGameStateBase>();
if(IsValid(CXGameStateBase) == true)
{
CXGameStateBase->MulticastRPCBroadcastLoginMessage(TEXT("zzageuli")); // 임시 이름
}
}

'내배캠Unreal_TIL > UE' 카테고리의 다른 글
| [TIL] 2026-03-12 | Property Replication (0) | 2026.03.12 |
|---|---|
| [TIL] 2026-03-11 | 반투명 머티리얼 만들기 (0) | 2026.03.11 |
| [TIL] 2026-03-10 | Remote Procedure Call 기초 (2) | 2026.03.10 |
| [TIL] 2026-03-10 | 아웃라인, 역광효과 머티리얼 만들기, Rim Light Effect, World Position Offset (0) | 2026.03.10 |
| [TIL] 2026-03-09 | UE NetMode, NetConnection, NetDriver, NetRole (2) | 2026.03.09 |