2025/04/01 -RPC실행 방식과 액터 소유권 개념 정리-

초보 게임개발자·2025년 4월 1일

UnrealEngine

목록 보기
18/19

언리얼 엔진에서는 RPC(Remote Procedure Call, 원격 프로시저 호출) 을 사용하여 서버와 클라이언트 간에 함수 호출을 동기화할 수 있습니다. 하지만, 액터의 소유권(Ownership)에 따라 RPC의 실행 방식이 달라집니다.

주요개념

NetMulticast RPC: 서버에서 실행되며, 모든 클라이언트에서도 실행됨.

Server RPC (Run on Server): 클라이언트가 요청하면 서버에서 실행됨.

Client RPC (Run on Owning Client): 서버가 특정 클라이언트에서 실행되도록 요청함.

소유권(Ownership): 액터가 어느 네트워크 노드(서버/클라이언트)에 속해 있는지를 결정함.

1. Client-Owned Actor (클라이언트 소유 액터)

특징:

기본 실행: 서버에서 실행됨.

NetMulticast RPC: 서버와 모든 클라이언트에서 실행됨.

Server RPC: 서버에서 실행됨.

Client RPC: 해당 액터를 소유한 클라이언트에서만 실행됨.

UFUNCTION(Server, Reliable)
void ServerFunction();

UFUNCTION(NetMulticast, Reliable)
void MulticastFunction();

UFUNCTION(Client, Reliable)
void ClientFunction();

동작 방식:

ServerFunction() → 서버에서 실행됨.

MulticastFunction() → 서버와 모든 클라이언트에서 실행됨.

ClientFunction() → 액터를 소유한 클라이언트에서만 실행됨.
(다른 클라이언트에서는 실행되지 않음)


2. Server-Owned Actor (서버 소유 액터)

특징:

기본 실행: 서버에서 실행됨.

NetMulticast RPC: 서버와 모든 클라이언트에서 실행됨.

Server RPC: 서버에서 실행됨.

Client RPC: 서버에서 실행됨 (클라이언트에서 실행되지 않음).

UFUNCTION(Client, Reliable)
void ClientOnlyFunction();  // 서버 소유 액터에서는 실행되지 않음.

UFUNCTION(Server, Reliable)
void ServerFunction();  // 서버에서 정상 실행됨.

UFUNCTION(NetMulticast, Reliable)
void MulticastFunction();  // 서버와 모든 클라이언트에서 실행됨.

동작 방식:

ClientOnlyFunction() → 클라이언트에서 실행되지 않음! (서버 소유 액터는 클라이언트에서 실행 불가)

ServerFunction() → 서버에서 실행됨.

MulticastFunction() → 서버와 모든 클라이언트에서 실행됨.


3. Unowned Actor (소유되지 않은 액터)

특징:

기본 실행: 서버에서 실행됨.

NetMulticast RPC: 서버와 모든 클라이언트에서 실행됨.

Server RPC: 서버에서 실행됨.

Client RPC: 서버에서 실행됨 (클라이언트에서 실행되지 않음).

UFUNCTION(Server, Reliable)
void ServerFunction();

UFUNCTION(Client, Reliable)
void ClientFunction();  // 실행되지 않음!

UFUNCTION(NetMulticast, Reliable)
void MulticastFunction();

동작 방식:

ServerFunction() → 서버에서 실행됨.

ClientFunction() → 실행되지 않음! (소유권이 없으므로, 클라이언트에서 실행할 수 없음)

MulticastFunction() → 서버와 모든 클라이언트에서 실행됨.


4. Owned by Invoking Client (RPC를 호출한 클라이언트가 액터 소유)

특징:

레플리케이션 안된 상태: 호출한 클라이언트에서 실행됨.

NetMulticast RPC: 모든 클라이언트에서 실행됨.

Server RPC: 서버에서 실행됨.

Client RPC: 호출한 클라이언트에서 실행됨.

UFUNCTION(Server, Reliable)
void ServerFunction();  // 서버에서 실행됨.

UFUNCTION(Client, Reliable)
void ClientFunction();  // 소유한 클라이언트에서만 실행됨.

UFUNCTION(NetMulticast, Reliable)
void MulticastFunction();  // 모든 클라이언트에서 실행됨.

동작 방식:

ServerFunction() → 서버에서 실행됨.

ClientFunction() → 액터를 소유한 클라이언트에서만 실행됨.

MulticastFunction() → 모든 클라이언트에서 실행됨.


5. Owned by a Different Client (다른 클라이언트가 액터 소유)

특징:

레플리케이션 안된 상태: 호출한 클라이언트에서 실행됨.

NetMulticast RPC: 호출한 클라이언트에서 실행됨 (다른 클라이언트에는 영향 없음).

Server RPC: 실행되지 않음 (Dropped).

Client RPC: 호출한 클라이언트에서만 실행됨.

UFUNCTION(Server, Reliable)
void ServerFunction();  // 실행되지 않음! (서버에서 Dropped 됨)

UFUNCTION(Client, Reliable)
void ClientFunction();  // 호출한 클라이언트에서만 실행됨.

UFUNCTION(NetMulticast, Reliable)
void MulticastFunction();  // 호출한 클라이언트에서만 실행됨.

동작 방식:

ServerFunction() → 실행되지 않음 (서버에서 Dropped됨).

ClientFunction() → 호출한 클라이언트에서 실행됨.

MulticastFunction() → 호출한 클라이언트에서만 실행됨 (다른 클라이언트에는 실행되지 않음).


정리

Client RPC는 액터를 소유한 클라이언트에서만 실행 가능.

Server RPC는 서버에서 실행되지만, 소유권이 없는 경우 Dropped 될 수 있음.

NetMulticast는 서버와 모든 클라이언트에서 실행 가능.

profile
기록은 기억을 지배한다!

0개의 댓글