온라인 비컨

Online Beacon, 온라인 비컨 시스템 개요입니다.

Choose your operating system:

Windows

macOS

Linux

Online Beacon (온라인 비컨)이란, 일반 게임 접속을 통하지 않고도 서버와 접촉하여 (RPC 를 통해) 상호작용이 가능한 가벼운 방식을 제공해 주는 특수 유형 액터 입니다. 특수한 경우 내장 클래스를 그대로 사용할 수는 있지만, 프로젝트에 맞는 상호작용, 로직, 정보 요청 처리를 위한 커스텀 클래스 확장에 더욱 적합합니다.

온라인 비컨 베이스 클래스

비컨 클래스로 이루어지는 일반적인 작업은 서비스 품질 정보 요청, 클라이언트가 참여하고자 하는 게임의 슬롯 예약, 게임의 플레이어 이름 목록, 진행중인 게임의 진행 시간 및 점수 찾기 등입니다. 엔진에 제공되는 클래스는 다음과 같으며, 온라인 비컨 시스템의 근간을 이룹니다:

AOnlineBeacon

AOnlineBeaconClient AOnlineBeaconHost 의 베이스 클래스입니다. AActor 에서 직접 파생됩니다.

AOnlineBeaconHost

이 클래스는 별도의 UNetDriver 를 사용하여 원격 클라이언트 머신에서 들어오는 온라인 비컨 접속을 리스닝합니다. 하나 받으면 등록된 AOnlineBeaconHostObject 인스턴스를 대상으로 들어오는 클라이언트에 일치하는 것을 찾은 뒤, 그 쪽에 접속을 넘겨줍니다. 이 클래스는 보통 파생시킬 필요가 없는데, 클라이언트와 등록된 AOnlineBeaconHostObject 사이 초기 접속만 관리하기 때문입니다.

AOnlineBeaconClient

이 클래스의 자손은 호스트에 접속하여 실제 RPC 를 만듭니다. 이들 중 하나가 클라이언트 머신에서 스폰되며, 하나는 서버의 AOnlineBeaconHost 로 등록된 적합한 AOnlineBeaconHostObject 에 의해 서버에서 스폰됩니다. 기본적으로, (클래스 이름이 될) GetBeaconType 함수 출력을 사용하여 이 클래스의 인스턴스를 적합한 호스트 오브젝트 클래스의 등록 인스턴스에 일치시킵니다. 참고로 이 방식은 서버가 액터를 스폰한 뒤 클라이언트에 리플리케이트하는 일반적인 액터 스포닝 방식과 다릅니다. 하지만 오브젝트의 클라이언트 사본과 서버 사본 사이 접속이 이루어진 후에는, 어느 한 쪽이 다른 쪽에 RPC 를 할 수 있게 되면서 오브젝트 리플리케이션이 정상적으로 이루어지게 되며, 오브젝트의 서버 버전은 프로퍼티 리플리케이션 관련해서 오소리티를 갖게 됩니다. 베이스 클래스는 OnConnected OnFailure 함수를 구현하며, 이를 자손 클래스에서 오버라이드하여 접속 시 RPC 를 호출하거나, 접속 실패 처리를 할 수 있습니다. 이 클래스가 온라인 비컨 시스템의 역꾼이며, 비컨에서 요하는 클라이언트측 작업을 하게 됩니다. 접속이 성공적으로 이루어진 경우 서버에서 두 번째 인스턴스가 원본과 동기화된 상태로 스폰되는데, 이 클래스 역시 클라이언트와 서버 RPC, 또는 서버에서 클라이언트로 리플리케이트되는 프로퍼티를 조정하고 통신해 가며 서버 측 작업을 할 수 있습니다.

AOnlineBeaconHostObject

이 클래스를 오버라이드하여 오버라이드된 AOnlineBeaconClient 클래스와 짝을 이루도록 만들 수도 있습니다. 클라이언트의 GetBeaconType 반환 값을 BeaconTypeName 멤버 변수에 저장된 값과 일치시키는 것으로 짝을 이룰 수 있습니다. 서버의 AOnlineBeaconHost 가 들어오는 AOnlineBeaconClient 에 대해 짝을 이룬 AOnlineBeaconHostObject 를 감지하면, AOnlineBeaconHostObject 더러 SpawnBeaconActor 함수를 통해 AOnlineBeaconClient 로컬 사본을 스폰시키도록 합니다. 기본적으로 이 함수는 ClientBeaconActorClass 멤버 변수를 사용하여 스폰시킬 액터 클래스를 결정하며, 이는 짝을 이룬 AOnlineBeaconClient 클래스로 설정되어야 할 것입니다. 스폰된 오브젝트의 서버측 사본에서 SetBeaconOwner 도 호출해야, 클라이언트 오브젝트의 서버측 인스턴스가 호스트 오브젝트와 통신을 할 수 있을 것입니다. 이 구성 대부분은 베이스 클래스에서 이루어지며, 오버라이드할 필요가 없습니다.

온라인 비컨 예제

엔진에는 이미 미리 만들어진 비컨 클래스 짝이 다양하게 있는데, 직접 만들기에 참고하기 좋은 간단한 예제로는 Test Beacon (테스트 비컨)이 좋습니다. ATestBeaconClient AOnlineBeaconClient 에서 파생되며, ATestBeaconHost AOnlineBeaconHostObject 에서 파생됩니다. 테스트 비컨은 단순히 클라이언트와 서버 사이에서 반복 함수 콜백을 할 뿐입니다. 그 클래스들이 서로 작동하는 방식은 이렇습니다:

  1. ATestBeaconHost 의 생성자에서, ClientBeaconActorClass ATestBeaconClient 의 클래스로 설정되며, BeaconTypeName 는 ( GetName 함수를 호출하여 얻은) ClientBeaconActorClass 이름으로 설정됩니다. 그러면 AOnlineBeaconHost 가 두 개의 Test Beacon 클래스에 제대로 짝지어 집니다.

  2. 클라이언트의 ATestBeaconClient 가 서버 접촉에 성공하면, 서버의 AOnlineBeaconHost 인스턴스는 등록된 ATestBeaconHost 더러 자신의 ATestBeaconClient 를 스폰시켜 클라이언트의 ATestBeaconClient 에 연관시키도록 합니다. 이 작업은 중요한데, 클라이언트와 서버 RPC 가 두 ATestBeaconClient 인스턴스를 오갈 수 있도록 해주기 때문입니다.

  3. 그 후 서버의 ATestBeaconHost 는 자체 ATestBeaconClient 인스턴스에서 클라이언트 RPC 인 OnClientConnected 를 호출합니다. 이 함수는 클라이언트 RPC 이므로, 함수 호출 명령은 서버측 함수를 호출하기 보다는 클라이언트 머신에 전달됩니다.

  4. 클라이언트의 ATestBeaconClient 인스턴스에서 RPC 는 ClientPing 를 호출하도록 오버라이드된 가상 OnConnected 함수를 실행시킵니다.

  5. ClientPing 은 디버그 로그에 약간의 텍스트를 출력한 뒤 서버 RPC 인 ServerPong 를 호출하고, 이를 접속된 네트워크를 통해 전송하고 서버의 ATestBeaconClient 인스턴스에서 실행시킵니다.

  6. ServerPong 은 디버그 텍스트를 출력한 뒤 ClientPing 를 호출, 다시 클라이언트로의 네트워크 RPC 호출을 발동시킵니다.

  7. 이 프로세스가 무한히 계속됩니다. 특히나 RPC 가 어떤 작업도 하지 않고 있으니 바람직한 작업은 아니지만, 같은 RPC 를 두 번 연달아 호출했을 때 걸리는 시간을 기록하는 것으로 서버의 핑 시간 기록을 유지하는 데 쓸 수 있습니다. 딜레이를 둬서 컴퓨터나 네트워크의 핑 검사 빈도를 줄이거나, 핑을 몇 번 한 이후에는 클라이언트와 서버에서 핑을 주고 받는 것을 그냥 멈추도록 할 수도 있습니다. 다른 사용법이라면 클라이언트에 RPC 콜백을 루프가 아닌 한 번만 하는 것으로, 예를 들면 게임이나 프로젝트에 관련이 있을 수 있는 정보에 따라 "이 서버의 게임에 사용되는 맵이 뭐지?" 라거나 "깃발 뺏기 서버인가?" 와 같은 질문을 하는 것입니다.

언리얼 엔진 문서의 미래를 함께 만들어주세요! 더 나은 서비스를 제공할 수 있도록 문서 사용에 대한 피드백을 주세요.
설문조사에 참여해 주세요
건너뛰기