유니티에서 네트워킹 요소들 Networking Elements in Unity

유니티의 네이티브 네트워킹(native networking)은 이 전의 페이지에서 논의된 모든 것들을 지원합니다. 서버 생성과 클라이언트 접속, 접속된 클라이언트들 사이에 데이터 공유, 어떤 플레이어가 어떤 오브젝트를 제어할 지 결정, 네트워크 설정 변형들의 접속(punch through)들은 모두 지원됩니다. 이 페이지는 이러한 네트워킹의 실행을 유니티용 구현방식으로 살펴볼 것입니다.

서버 생성 Creating a Server

네트워크 게임을 플레이 하기 전에, 통신을 할 다른 컴퓨터들을 결정해야 합니다. 이를 위해서는 서버를 생성해야 합니다. 이는 게임을 실행하는 머신일 수도 있고, 게임에 참여하지 않는 서버용 머신일 수도 있습니다. 서버를 생성하기 위해서는, 스크립트로부터Network.InitializeServer()를 호출 합니다. 클라이언트로서 이미 존재하는 서버의 접속을 원하면, Network.Connect()를 대신 호출 합니다. 일반적으로, 전체 네트워크 클래스 (Network class)를 익히는 것이 매우 유용하다는 것을 알게 될 것입니다.

In general, you will find it very useful to familiarize yourself with the entire Network class.

네트워크 뷰를 사용한 통신 Communicating using Network Views

네트워크 보기는 네트워크로 데이터를 보내는 컴포넌트입니다. 네트워크 보기들은GameObject를 RPC 호출들로 데이터를 전송하거나 상태 동기화를 할 수 있게 합니다. 네트워크 보기를 사용하는 방식은 게임의 네트워킹 작용이 어떤 식으로 이루어질지를 결정합니다. 네트워크 보기들은 적은 옵션들이 있지만, 네트워크 게임에서는 매우 중요합니다. 네트워크 보기를 사용하는데 더 많은 정보는 Network View Guide 페이지와 Component Reference 페이지를 참조하시길 바랍니다.

원격 절차 호출 Remote Procedure Calls (RPC)

RPC (Remote Procedure Call)들은 스크립트들 내에서 선언된 함수들이고, 네트워크 보기를 포함하는GameObject에 부착되어 있습니다. 네트워크 보기는 RPC 함수를 포함하는 스크립트를 다루어야 합니다. RPC 함수는GameObject내에서 어떤 스크립트 에서부터 불려질 수 있습니다. 유니티에서 RPC들을 사용하는 것에 대한 더 정보는”RPC Details” 페이지를 참조하세요.

상태 동기화 State Synchronization

상태 동기화는 모든 게임 클라이언트들을 아우르는 연속적인 데이터의 공유입니다. 이 방식으로 플레이어의 위치는 모든 클라이언트들에게 동기화 되고, 데이터가 네트워크로 전송될 때 지역적으로 제어되는 것처럼 보입니다. GameObject내에서 상태를 동기화 하기 위하여, 오브젝트에 네트워크 보기를 추가할 필요가 있으며, 무엇을 관측할 지를 알려줄 필요가 있습니다. 관측된 데이터는 게임에서 모든 클라이언트를 통해서 동기화 됩니다. 유니티에서 상태 동기화에 대한 더 많은 정보를 원하시면 “State Synchronization” 페이지를 참조하시길 바랍니다.

Network.Instantiate()

Network.Instantiate()는 모든 클라이언트의 prefab을 자연스럽고 쉽게 인스턴스화 하게 해줍니다. 기본적으로, 이는Instantiate() 호출이며, 모든 클라이언트의 인스턴스화 오퍼레이션을 수행합니다. 내부적으로 Network.Instantiate는 단지 버퍼 된 RPC 호출이고, 모든 클라이언트들에게 (지역적 수행 포함) 수행됩니다. Network.Instantiate는NetworkViewID를 할애하고, 그것을 인스턴스화된 prefab에 할당합니다. 인스턴스화된 prefab는 모든 클라이언트들에 대해서 이 함수가 제대로 동기화하는 것을 확실하게 합니다. 더 많은 정보를 원하시면 Network Instantiate 페이지를 참조하시길 바랍니다.

NetworkLevelLoad()

데이터 공유 다루기, 클라이언트 플레이어들의 상태, 레벨들을 로딩하는 것은 굉장히 힘든 일이긴 합니다. Network Level Load 페이지는 이 일을 다루는 유용한 예제들을 포함합니다.

마스터 서버 Master Server

마스터 서버는 게임들을 연결하는 것을 돕습니다. 서버를 시작할 때 마스터 서버로 접속하고, 마스터 서버는 모든 활성화된 서버들의 리스트를 제공합니다.

마스터 서버는 서버들과 클라이언트들의 만남의 장소로, 서버들은 공시 되고 호환되는 클라이언트들은 실행중인 게임에 접속할 수 있습니다. 이는 모든 관련된 머신들의 IP 주소들을 다룰 필요를 없앱니다. 유저들로 하여금 일반적인 상황에서는 조작이 필요한 라우터들을 손대지 않고 게임을 호스트(host) 하는 것을 돕습니다. 마스터 서버는 클라이언트들의 통신이 서버의 방화벽들을 지나갈 수 있게 돕고, 공인 인터넷에는 주로 접근할 수 없는 사설 IP 주소들을 얻는 것을 돕습니다. 이는 facilitator 의 도움으로 이루어 지는데, facilitator는 접속의 수립을 촉진하도록 도와줍니다.

더 많은 정보를 원하시면 “Master Server” 페이지를 참조 하시길 바랍니다.

대역폭 최소화 Minimizing Bandwidth

게임을 정확하게 실행시키기 위해서 대역폭의 최소 양을 사용하는 것은 매우 중요합니다. 데이터를 보내는 각각 다른 방법들이 있고, 언제 무엇을 보내야 하는지를 결정하는, 그리고 여러 가지 기술들을 상황에 맞게 사용하는 다양한 방법들이 있습니다.

대역폭 사용을 줄이기 위한 팁들과 트릭들은 다음의”Minimizing Bandwith” 페이지를 참조하십시오.

네트워킹 게임의 디버깅 Debugging Networked Games

유니티는 네트워크된 게임의 디버깅을 돕는 여러 가지 편의제공(facility) 툴들이 있습니다.

  1. 네트워크 매니저는 모든 들어오는 나가는 네트워크 트래픽의 로깅(logging)을 위해 사용될 수 있습니다.
  2. 인스펙터(Inspector)와 계층 구조 보기(Hierarchy View)를 효율적으로 사용해서, 오브젝트 생성과 보기 아이디 등을 검사하며 추적할 수 있습니다.
  3. 같은 머신에서 유니티를 각각 다른 프로젝트를 열어 두 번 불러 실행(launch) 할 수 있습니다. 윈도우 환경에서는, 다른 유니티 인스턴스를 불러 실행하고, 프로젝트 마법사(project wizard)로 부터 프로젝트를 열어 수행할 수 있습니다. 맥 OS 환경에서는, 다중의 유니티 인스턴스 들이 터미널로부터 열리고, 매개 변수 -projectPath 가 지정됩니다: 
  /Applications/Unity/Unity.app/Contents/MacOS/Unity -projectPath "/Users/MyUser/MyProjectFolder/"
  /Applications/Unity/Unity.app/Contents/MacOS/Unity -projectPath "/Users/MyUser/MyOtherProjectFolder/"

플레이어가 네트워킹을 디버깅할 때 백그라운드에서 실행하는지 확인하고, 만약 두 인스턴스들이 한번에 실행되면, 둘 중 하나는 포커스(focus)처리 되지 않게 해야 합니다. 그렇지 않으면 네트워킹 룹(loop)이 깨지고 원하지 않는 결과를 얻을 수 있습니다. 이 기능을 가능하게 하려면, 에디터에서 Edit→Project Settings→Player 나 Application.runInBackground 를 사용하십시오.

역링크