Unreal Engine - Ownership 실습

SetOwner 함수로 소유권을 이전하는 실습이다.

먼저 블루프린트로 문제가 있는 코드로 작성하고 개선해보도록 한다.


서버 RPC 블루프린트 만들기

먼저 ThirdPerson 삼인칭 튜토리얼 프로젝트로 시작한다.

  • BP_ThirdPersonCharacter 블루프린트를 편집
  • Custom Event(Server_RPC), Print String, BeginPlay, IsServer, Branch, Call Function(Server_RPC)
  • Custom Event 는 Reliable 체크하여 TCP로 동작하고 Replicated 항목은 Run As Server로 설정한다.

실행 결과

Server: Hello
Server: Hello

블루프린트는 클라가 아닌 경우 함수를 호출하도록 되어있다.

함수 호출하는 인스턴스 구성

  • Client 1
    • BP_ThirdPersonCharacter 0
    • BP_ThirdPersonCharacter 1
    • BP_ThirdPersonCharacter 2
  • Client 2
    • BP_ThirdPersonCharacter 0
    • BP_ThirdPersonCharacter 1
    • BP_ThirdPersonCharacter 2

하지만 함수를 실행하는 것은 단 2개이다.

Run As Server 함수 실행

  • Server
    • BP_ThirdPersonCharacter <- Client 1
    • BP_ThirdPersonCharacter <- Client 2

클라이언트가 6개를 보냈는데 회신을 2개를 준 것이다.
이 쯤에서 예상하기로는 로컬 컨트롤러만 가져오는 것 아닌가? 라고 생각할 수 있는데, 예상이 맞았다.

Run As Server 로 동작할 경우 Call Function 앞단에 로컬인지 검증하고 있는 것이다.

  • 로컬 소유권인지 검증하는 로직이 숨겨져 있다.
  • 위의 블루프린트 그림은 로컬 소유권을 노드로 표현하였을 때 시각화한 모습이다.

Actor 소유권 가져오기

Actor는 월드에 인스턴스로 생성한 경우 소유권은 자동으로 서버가 갖게 된다.
클라이언트는 월드에 생성된 Actor에게 RPC 함수를 호출할 수 없으므로 소유권을 가져와보자.

BP_Sphere 생성

  • BP_Sphere 블루프린트 Actor를 생성한다.
  • BP_Sphere 열고 Sphere 컴포넌트를 추가한다.
  • 우측의 BP_Sphere 디테일로 Replicated 항목으로 복제 대상으로 체크한다.

BP_ThirdPersonGameMode 구체 스폰하기

  • BP_ThirdPersonGameMode 블루프린트를 오픈한다.
  • Spwan Actor From Actor 노드를 추가한다.
    • 클래스를 BP_Sphere 스폰하도록 한다.
    • Spawn Transform Location 위치를 Z 축 520 으로 지정한다.

BP_Sphere RPC 설정하기

  • RPC 작업에 필요한 노드를 추가한다.
    • IsServer BeginPlay CustomEvent, Print String, Call Function

시작하기

  • 플레이어를 3명에 Listen Server 로 지정한다.

게임 구동 시 아무런 반응이 없다. 콘텐츠 개발에 이와 같은 상황이 자주 마주쳐 당황할 수 있다. 언리얼 엔진의 소유권에 대한 개념을 꼭 알고 있어야 한다.


구체 소유권 가져오기

소유권을 가져 오는 방법이 두 가지 있다.

BP_ThirdPersonGameMode

  • Spawn Actor BP_Sphere 객체로 "Owner"로 설정
  • Set Owner 클래스를 가져와 스폰된 구체에서 소유권을 이전

  • Spwan Actor 클래스에서 Owner 에서 클라이언트의 Owner를 가져와 실행한다.

실행결과

Server: Hello
Server: Hello

이전에 실행되지 않았던 RPC 함수가 소유권을 해결하고나서 정상적으로 호출하는 모습을 보여준다.