unreal 8기

2026-6-10 TIL

왕건 2026. 6. 10. 17:13

TIL: Unreal Engine NetRole과 RPC 실행 위치 이해하기

 

오늘 배운 내용

오늘은 Unreal Engine 멀티플레이에서 Actor의 NetRoleRPC가 어디에서 실행되는지 정리했다.

처음에는 Authority, Autonomous Proxy, Simulated Proxy가 단순히 서버용, 클라이언트용으로 나뉘는 줄 알았다.

하지만 중요한 기준은 Actor 자체가 아니라, 현재 이 컴퓨터에서 그 Actor를 어떤 입장으로 보고 있느냐였다.

또 RPC도 Server, Client, NetMulticast라는 이름만 보고 실행 위치가 정해지는 것이 아니라, 누가 호출했는지Actor의 소유권이 함께 영향을 준다는 점을 배웠다.

 

1. NetRole은 현재 컴퓨터 기준의 역할이다

NetRole은 이 Actor가 지금 이 머신에서 어떤 권한으로 존재하는지를 나타낸다.

같은 PlayerCharacter라도 서버에서 볼 때와 클라이언트에서 볼 때 Role이 달라질 수 있다.

예를 들어 내 캐릭터를 기준으로 보면 다음과 같다.

Server
- 내 Character: Authority

내 Client
- 내 Character: Autonomous Proxy

다른 Client
- 내 Character: Simulated Proxy

즉 NetRole은 Actor에 고정된 이름표가 아니라, 현재 컴퓨터 기준의 입장이다.

 

2. Authority는 진짜 결정권을 가진 상태다

Authority는 게임 상태를 실제로 결정할 수 있는 권한이다.

멀티플레이에서는 보통 서버가 Authority를 가진다.

서버는 다음과 같은 최종 판단을 한다.

  • 이 캐릭터 위치는 어디인가
  • 이 공격이 맞았는가
  • 이 플레이어의 HP는 얼마인가
  • 이 아이템을 먹을 수 있는가

그래서 중요한 게임 로직은 보통 HasAuthority()를 확인하고 서버에서 처리한다.

if (HasAuthority())
{
    HP -= 10;
}

이 코드는 이 Actor가 권한을 가진 쪽, 보통 서버일 때만 HP를 변경하겠다는 뜻이다.

쉽게 말하면 Authority는 Actor의 원본을 가진 쪽이다.

 

3. Autonomous Proxy는 내가 조종하는 복제 Actor다

Autonomous Proxy는 내 클라이언트에서 내가 직접 조종하는 Actor다.

예를 들어 내 클라이언트에서 내 Character는 Autonomous Proxy다.

내가 W 키를 누르면 내 클라이언트는 서버에게 이동 요청을 보낸다.

내 Client
-> 앞으로 움직이고 싶어요

Server
-> 이동 가능하면 처리할게요

Autonomous Proxy는 서버 상태를 받기도 하지만, 내 입력을 서버로 보낼 수 있다는 점이 중요하다.

그래서 내 캐릭터는 입력에 즉시 반응하는 것처럼 보일 수 있다.

정리하면 Autonomous Proxy는 내가 소유하고 조종하는 클라이언트 쪽 복제 Actor다.

 

4. Simulated Proxy는 남의 Actor를 화면에 보여주는 복제 Actor다

Simulated Proxy는 내가 조종하지 않는 Actor를 서버 정보에 맞춰 보여주는 역할이다.

예를 들어 내 화면에 보이는 친구 Character는 Simulated Proxy다.

나는 친구 캐릭터를 조종할 수 없다.

대신 서버가 보내준 위치, 회전, 애니메이션 상태 등을 받아서 내 화면에 보여준다.

내 Client에서 보는 친구 Character
= Simulated Proxy

친구 Client에서 보는 친구 Character
= Autonomous Proxy

Server에서 보는 친구 Character
= Authority

즉 Simulated Proxy는 남이 조종하는 Actor를 내 화면에서 흉내 내서 보여주는 복제본이라고 이해하면 된다.

 

5. PlayerController, GameState, PlayerState는 복제 범위가 다르다

오늘 헷갈렸던 부분은 PlayerController와 GameState, PlayerState의 차이였다.

PlayerController는 소유한 클라이언트에게만 중요하다.

내 PlayerController
- Server: Authority
- 내 Client: Autonomous Proxy
- 다른 Client: None

다른 클라이언트는 내 PlayerController를 알 필요가 없다.

반대로 GameState는 모든 클라이언트가 알아야 하는 게임 전체 상태이기 때문에 모든 클라이언트에 복제된다.

GameState
- Server: Authority
- 모든 Client: Simulated Proxy

PlayerState도 닉네임, 점수, 팀 정보처럼 다른 사람도 알아야 하는 정보를 담기 때문에 모든 클라이언트에 복제된다.

내 PlayerState
- Server: Authority
- 내 Client: Simulated Proxy
- 다른 Client: Simulated Proxy

그래서 PlayerController는 다른 클라이언트에 보통 없고, 다른 플레이어의 정보는 PlayerState와 Character를 통해 본다.

 

6. RPC는 호출 위치와 Ownership에 따라 실행 위치가 달라진다

RPC는 네트워크를 통해 다른 위치에서 함수를 실행시키는 기능이다.

대표적으로 세 가지가 있다.

Server RPC
- 클라이언트가 서버에게 요청할 때 사용

Client RPC
- 서버가 특정 클라이언트에게 실행을 지시할 때 사용

NetMulticast RPC
- 서버가 서버와 모든 클라이언트에게 알릴 때 사용

하지만 RPC는 이름만 보고 무조건 실행되는 것이 아니다.

중요한 기준은 두 가지다.

  1. 누가 RPC를 호출했는가
  2. 그 Actor를 누가 소유하고 있는가

 

7. 클라이언트에서 Server RPC를 호출할 때

클라이언트가 서버에게 요청하려면 Server RPC를 사용한다.

예를 들어 채팅 메시지를 서버로 보내는 경우가 있다.

Client
-> Server_SendChatMessage()

Server
-> 메시지 검증 후 처리

하지만 클라이언트는 아무 Actor에서나 Server RPC를 호출할 수 없다.

클라이언트가 소유한 Actor에서 호출해야 서버로 전달된다.

내 PlayerController에서 Server RPC 호출
-> 서버에서 실행됨

내 Character에서 Server RPC 호출
-> 내가 소유한 Character라면 서버에서 실행됨

친구 Character에서 Server RPC 호출
-> Dropped

서버 소유 Actor에서 클라이언트가 Server RPC 호출
-> Dropped

Dropped는 호출이 버려진다는 뜻이다.

이 규칙이 없으면 클라이언트가 남의 캐릭터나 서버 소유 Actor를 마음대로 조작하려고 할 수 있기 때문에 위험하다.

 

8. 서버에서 Client RPC를 호출할 때

Client RPC는 서버가 특정 클라이언트에게만 실행시키고 싶을 때 사용한다.

예를 들어 서버가 나에게만 아이템 획득 메시지를 띄우고 싶다면 Client RPC가 어울린다.

Server
-> Client_ShowItemMessage()

내 Client
-> 아이템 획득 UI 표시

Client RPC는 Actor의 owning client에게 간다.

즉 서버가 내 PlayerController에서 Client RPC를 호출하면 내 클라이언트에서 실행된다.

하지만 Actor에 소유 클라이언트가 없으면 보낼 대상이 없기 때문에 서버에서만 실행되는 것처럼 동작할 수 있다.

 

9. NetMulticast는 서버에서 호출해야 모두에게 퍼진다

NetMulticast는 서버와 모든 클라이언트에서 실행시키고 싶을 때 사용한다.

예를 들어 폭발 이펙트를 모두에게 보여주고 싶을 때 사용할 수 있다.

Server
-> Multicast_PlayExplosion()

Server
-> 폭발 이펙트 실행

Client1
-> 폭발 이펙트 실행

Client2
-> 폭발 이펙트 실행

중요한 점은 NetMulticast는 서버에서 호출해야 진짜로 모두에게 전달된다는 것이다.

클라이언트에서 NetMulticast를 호출하면 모든 클라이언트로 퍼지지 않고, 호출한 클라이언트에서만 실행된다.

그래서 모두에게 알려야 하는 이벤트는 클라이언트가 직접 Multicast를 호출하는 것이 아니라, 먼저 Server RPC로 서버에 요청하고 서버가 Multicast를 호출해야 한다.

Client
-> Server_RequestExplosion()

Server
-> Multicast_PlayExplosion()

All Clients
-> 폭발 이펙트 실행

 

오늘 헷갈렸던 점

처음에는 Autonomous Proxy와 Simulated Proxy가 단순히 클라이언트 Actor를 나누는 말인 줄 알았다.

하지만 Autonomous Proxy는 내가 소유하고 입력을 보낼 수 있는 Actor이고, Simulated Proxy는 내가 조종하지 않고 서버 상태만 받아서 보여주는 Actor다.

또 GameState와 PlayerState는 모든 클라이언트에 복제되지만, PlayerController는 소유 클라이언트에게만 존재한다는 점도 중요했다.

RPC도 마찬가지로 Server, Client, NetMulticast 이름만 보는 것이 아니라, 호출한 쪽과 Actor ownership을 같이 봐야 한다.

 

오늘의 핵심 정리

  1. NetRole은 현재 컴퓨터에서 그 Actor를 어떤 입장으로 보는지 나타낸다.
  2. Authority는 보통 서버가 가진 진짜 결정권이다.
  3. Autonomous Proxy는 내가 조종하는 클라이언트 쪽 Actor다.
  4. Simulated Proxy는 남의 Actor를 내 화면에 보여주는 복제 Actor다.
  5. PlayerController는 소유 클라이언트에게만 있고, 다른 클라이언트에는 보통 없다.
  6. GameState와 PlayerState는 모든 클라이언트에 복제된다.
  7. Server RPC는 클라이언트가 서버에게 요청할 때 사용하며, 소유한 Actor에서 호출해야 한다.
  8. Client RPC는 서버가 owning client에게 실행시키고 싶을 때 사용한다.
  9. NetMulticast는 서버에서 호출해야 서버와 모든 클라이언트에서 실행된다.
  10. 클라이언트에서 호출한 NetMulticast는 모두에게 퍼지지 않고 호출한 클라이언트에서만 실행된다.

정리하면 NetRole은 Actor의 네트워크상 입장을 이해하기 위한 기준이고, RPC는 그 입장과 소유권을 바탕으로 어디에서 실행될지 결정된다.

오늘 내용을 통해 Unreal 멀티플레이에서 Actor가 누구의 것인지, 그리고 함수가 어디에서 실행되는지를 조금 더 명확하게 이해할 수 있었다.

'unreal 8기' 카테고리의 다른 글

2026-6-15 TIL  (0) 2026.06.15
2026-6-11 TIL  (0) 2026.06.11
2026-6-9 TIL  (0) 2026.06.09
2026-6-4 TIL  (0) 2026.06.04
[7번 과제] Pawn 클래스 3D캐릭터 만들기  (0) 2026.04.16