Client RPC로 특정 클라이언트에 알리기
16강. Client RPC로 특정 클라이언트에 알리기
1. 이번 강의에서 해결할 문제
상호작용 실패 이유나 개인 매치 초대처럼 한 플레이어만 알아야 할 정보를 GameState에 복제하면 모두가 받고 상태가 불필요하게 남습니다. 반대로 서버가 Widget을 직접 열 수는 없습니다. 서버는 Owning Connection을 가진 Actor에서 Client RPC를 호출해야 합니다.
2. 학습 목표
3. 핵심 개념
Client RPC는 서버의 특정 Actor에서 호출하고 그 Actor의 Owning Connection에 전달합니다. PlayerController는 연결과 직접 대응하므로 개인 알림에 자연스럽습니다. GameState처럼 특정 Client Owner가 없는 Actor에서 호출하면 예상한 한 명을 찾지 못합니다.
Client RPC는 과거 메시지를 늦은 참가자에게 재생하지 않습니다. “현재 준비 상태”처럼 지속되어야 할 값은 PlayerState 또는 OwnerOnly Property로 두고, “상호작용 거절: 너무 멂”처럼 순간 안내만 Client RPC로 보냅니다.
4. 단계별 실습
UENUM(BlueprintType)
enum class ERequestRejectReason : uint8
{
TooFar,
InvalidState,
Cooldown,
NotAvailable
};
UFUNCTION(Client, Reliable)
void Client_RequestRejected(ERequestRejectReason Reason);
UFUNCTION(BlueprintImplementableEvent, Category = "UI")
void ShowRequestRejected(ERequestRejectReason Reason);
void ACaptureArenaPlayerController::Client_RequestRejected_Implementation(
ERequestRejectReason Reason)
{
if (!IsLocalController()) return;
UE_LOG(LogTemp, Display, TEXT("Request rejected Reason=%d"),
static_cast<int32>(Reason));
ShowRequestRejected(Reason);
}
ACaptureArenaPlayerController* CapturePC =
Cast<ACaptureArenaPlayerController>(Controller);
if (DistanceSq > FMath::Square(MaxInteractDistance))
{
if (CapturePC)
{
CapturePC->Client_RequestRejected(ERequestRejectReason::TooFar);
}
return;
}
Client RPC 인자는 사용자에게 보여 줄 제한된 이유 코드만 보냅니다. 서버 내부 보안 규칙, 비밀 식별자나 다른 플레이어의 개인 데이터를 그대로 전달하지 않습니다.
5. 코드가 동작하는 이유
서버에는 모든 PlayerController가 있고 각 Controller는 하나의 Owning Connection에 연결됩니다. 서버가 그 Controller에서 Client RPC를 호출하면 해당 클라이언트의 Controller 복사본에서 실행되어 로컬 UI 이벤트를 발생시킵니다. 다른 클라이언트에는 그 Controller 자체가 없으므로 메시지를 받지 않습니다.
6. 자주 하는 실수와 해결법
7. 직접 실습
8. 이해 점검 질문 3개
9. 핵심 요약
Client RPC로 특정 클라이언트에 알리기 미니 퀴즈
선택 즉시 정답과 해설을 확인할 수 있습니다. 결과는 이 브라우저에만 저장됩니다.
학습을 마쳤나요?
직접 실습과 점검 질문까지 확인한 뒤 완료로 표시하세요.