언리얼 공부

RPC 이해하기

jeongchanhyo 2025. 3. 19. 21:41

RPC란?

RPC( Remote Procedure Call )는 네트워크 환경에서 한 시스템(클라이언트)이 다른 시스템(서버)에 함수를 실행해 달라고 요청하는 방식. 쉽게 말해서, "클라이언트가 서버의 함수를 직접 호출할 수 있도록 해주는 개념"이다.

언리얼 엔진에서 RPC의 역할

언리얼 엔진에서 RPC는 서버와 클라이언트 간 데이터 동기화 및 함수 호출을 위해 사용된다.

특히, 멀티플레이어 게임에서는 필수적인 기능이다!

RPC 유형 호출 방향 사용 예시
Client RPC 서버 -> 클라이언트 서버에서 클라이언트의 UI 업데이트 요청
Sever RPC 클라이언트 -> 서버 플레이어 입력을 서버로 전달
Multicast RPC 서버 -> 모든 클라이언트 이펙트, 애니메이션 동기화

RPC 예시

보드게임 Bang을 아신다면 이해하실 수 있으실텐데요 Bang 카드 사용 시 데이터가 어떻게 흘러가는지 시퀀스 다이어그램으로 정리해봤습니다. 사실 UI는 있어야되는데 뺐습니다. 여기서 PlayerController가 UI, 즉 클라이언트 까지 같이한다고 보시면 됩니다.

위쪽의 부분만 간단하게 정리하자면

표 정리

단계 RPC유형 호출 방향 설명
1. 공격 요청 Sever RPC PlayerController->GamMode 클라이언트에서 서버로 공격 요청 전송
2. 피해자 정보 전달 일반 함수 호출 GameMode->PlayerState 서버에서 피해자 상태 확인
3. 회피여부 선택 요청 Client RPC PlayerController->UI 서버에서 클라이언트 UI에 회피 선택 요청
4. 회피응답 전송 Sever RPC PlayerController->Sever 클라이언트가 회피 여부를 선택해 서버에 전달
5. 체력 갱신 Client RPC PlayerState->PlayerController 서버에서 클라이언트 UI에 체력 업데이트 요청
6.게임 종료 체크 MultiCast RPC GameMode -> 모든 클라이언트 게임 종료 여부를 모든 클라이언트에 알림

예시 코드

클라이언트에서 공격시작( PlayerController → Server )

UFUNCTION(Server, Reliable)
void Server_RequestAttack(APlayerState* TargetPlayer);

// 서버에서 공격 요청을 처리하는 함수
void AMyPlayerController::Server_RequestAttack_Implementation(APlayerState* TargetPlayer) {
    // 공격 로직 수행 (사거리 내 대상 확인, 카드 사용 처리 등)
    //PlayerState의 공격받는 로직 수행
}

피해자 회피 여부 결정(  PlayerController->UI)

UFUNCTION(Client, Reliable)
void Client_ShowDodgeOption();

// 클라이언트에서 회피 선택 UI를 띄움
void AMyPlayerState::Client_ShowDodgeOption_Implementation() {
    // 회피 카드 사용 여부 선택하는 UI 표시
    ShowDodgeCardUI();
}

플레이어 사망 시 팀 체크 및 게임 종료 여부 확인( GameMode → GameState → PlayerController )

UFUNCTION(NetMulticast, Reliable)
void Multicast_AnnounceGameEnd(ETeam WinningTeam);

// 서버에서 게임 종료 체크 후 모든 클라이언트에게 결과 전달
void AMyGameMode::CheckGameEnd() {
    if (IsGameOver()) {
        Multicast_AnnounceGameEnd(WinningTeam);
    }
}

void AMyGameMode::Multicast_AnnounceGameEnd_Implementation(ETeam WinningTeam) {
    // UI에 승리 팀 표시
    ShowWinningTeamUI(WinningTeam);
}

이렇게 볼 수 있다. 

 

RPC를 이해하려면 게임 내의 데이터 패킷의 이동흐름을 잘 이해해야 그 다음에 이해할 수 있기 때문에 처음에 그냥 봐서는 이해가 안됐던것이다.