[UE4] RPC - Remote Procedure Call

    RPC란

    로컬에서 호출되지만 다른 머신에서 원격 실행되는 함수

    RPC를 이용하면 네트워크 연결을 통해 클라이언트와 서버 간의 통신이 가능하다.


    RPC 사용하기

    함수를 RPC로 선언하려면 UFUNCTION 내부에 Client, Server, NetMulticast 키워드를 붙여주면 된다.

     

    Client - 서버에서 호출, 클라이언트에서 실행

    UFUNCTION(Client)
    void ClientRPCFunction();

     

    Server - 클라이언트에서 호출, 서버에서 실행

    UFUNCTION(Server)
    void ServerRPCFunction();

     

    NetMulticast - 서버에서 호출, 서버와 모든 클라이언트에서 실행

    UFUNCTION(NetMulticast)
    void MulticastRPCFunction();

    주의사항

    1. Actor에서 호출되어야 한다.

    2. Actor는 반드시 replicated여야 한다.

    3. 서버에서 호출되고 클라이언트에서 실행되는 RPC의 경우, 해당 Actor를 소유하는 클라이언트에서만 함수가 실행됨

    4. 클라이언트에서 호출되고 서버에서 실행되는 RPC의 경우, RPC가 호출되는 Actor를 클라이언트가 소유해야 함

    5. Multicast RPC는 예외

              - 서버에서 호출되는 경우, 서버에서는 로컬에서 실행될 뿐 아니라 연결된 모든 클라이언트에서도 실행됨

              - 클라이언트에서 호출되는 경우, 로컬에서만 실행되며 서버에서는 실행되지 않음

              - 멀티캐스트 함수는 액터의 네트워크 업데이트 기간동안 두 번 이상 리플리케이트되지 않음


    신뢰성

    RPC는 비신뢰성이므로 RPC 호출이 원격 머신에서 확실히 실행되도록 하기 위해 Reliable 키워드를 추가하면 된다.

    UFUNCTION(Client, Reliable)
    void ClientRPCFunction();

    인증

    악성 데이터/입력 감지를 위한 인증(validation) 기능을 사용하기 위해서는 WithValidation 키워드를 추가하면 된다.

    이를 사용할 경우 인증 함수가 악성 파라미터를 감지했을 때 해당 RPC를 호출한 클라이언트/서버 연결을 끊도록 시스템에 알린다.

    UFUNCTION(Server, WithValidation)
    void ServerAddHealth(int32 amount);

     

    validation 함수를 추가했다면 다음과 같이 Implementation과 Validate 함수를 추가하면 된다.

    bool ServerAddHealth_Validate(int amount)
    {
    	if (amount > MAX_ADD_HEALTH)
        	return false;	// 호출한 곳의 연결을 끊음
            
        return true;
    }
    
    void ServerAddHealth_Implementation(int32 amount)
    {
    	Health += amount;
    }

    참고 문서

    https://docs.unrealengine.com/4.27/ko/InteractiveExperiences/Networking/Actors/RPCs/

    'unreal engine' 카테고리의 다른 글

    [UE4] Role, Remote Role  (0) 2023.06.11
    [UE4] Actor, Pawn, Character  (0) 2023.06.11

    댓글