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 함수가 소유권을 해결하고나서 정상적으로 호출하는 모습을 보여준다.