Network View
Network Views
는 Unity에서 네트워크화된 멀티 플레이어 게임을 생성하기 위해 이르는 길입니다. 그들은 사용하기 쉬우나 강력하게 파워풀 합니다. 이런 이유를 위해 사용자가 사용자가 네트워크 뷰와 함께 실험하는 것을 시작하기 전에 네트워킹하는 것의 뒤의 근본적인 개념을 이해하는 것이 권장됩니다. 사용자는 Network Reference Guide에서 기본적인 개념을 배우고 발견할 수 있습니다.
어떠한 네트워킹 능력을 사용하기 위해서 State Synchronization
또는 Remote Procedure Calls
를 포함해서 사용자의 GameObject
는 부착된 네트워크 뷰를 가져야만 합니다.
Properties
State Synchronization | 네트워크 뷰에 의해 사용되는 State Synchronization 타입 |
»>Off | State Synchronization가 사용되지 않을 것입니다. 이것은 사용자가 오직 RPCs를 보내기를 원한다면 가장 좋은 선택사항 입니다 |
»>Reliable Delta Compressed | 아무것도 바뀌지 않고 보내지지 않을 것이라면 마지막과 현재 상태의 차이는 보내질 것입니다. 이 모드는 명령됩니다. 패킷 로스의 경우에 잃어버린 패킷은 자동적으로 다시 보내질 것입니다 |
»>Unreliable | 완전한 상태가 보내질 것입니다. 이것은 더 많은 대역폭을 사용하나 패킷 로스의 영향은 최소화 됩니다 |
Observed | 네트워크를 통해서 보내질 Component 데이터 |
View ID | 네트워크 뷰를 위한 고유한 인식자. 이러한 값들은 인스펙터에서 오직 읽을 수만 있습니다 |
»>Scene ID | 이런 특정한 씬에서 네트워크 뷰의 아이디 넘버 |
»>Type | 실시간으로 Scene에 저장되거나 또는 Allocated |
Details
사용자가GameObject에 네트워크 뷰를 추가할 때 사용자는 두 가지를 결정해야 합니다
- 사용자가 원하는 어떠한 데이터를 네트워크 뷰가 보낼지
- 사용자가 그 데이터를 어떻게 보낼지
Choosing data to send
네트워크 뷰의 Observed 속성은 하나의 컴포넌트를 포함할 수 있습니다. 이것은 변환 Transform
, Animation
, RigidBody
또는 하나의 스크립트일 수 있습니다. Observed 컴포넌트가 무엇이던간에 그것에 대한 데이터가 네트워크를 통해서 보내질 것입니다. 사용자는 선택 박스로 부터 하나의 컴포넌트를 선택할 수 있거나 또는 어떠한 컴포넌트 헤더라도 직접적으로 변수에 드래그 할 수 있습니다. 사용자가 직접적으로 데이터를 보내지 않고 있다면 RPC 콜을 사용해서 사용자는synchronization (어떠한 데이터도 직접 보내지지 않는)을 끌 수 있고 어떤 것도 관찰된 속성으로서 세팅되어질 필요가 없습니다. RPC 콜은 하나의 네트워크 뷰가 필요해서 사용자는 하나의 뷰가 이미 존재한다면 RPC를 위해 특별히 뷰를 추가할 필요가 없습니다.
How to send the data
사용자는 Observed 컴포넌트의 데이터를 보내기 위한 2가지의 옵션을 가집니다: State Synchronization
와 Remote Procedure Calls
.
State Synchronization를 사용하기 위해서 네트워크 뷰의 State Synchronization을 Reliable Delta Compressed 또는Unreliable으로 세팅합니다. Observed 컴포넌트의 데이터는 네트워크를 통해서 자동적으로 보내질 것입니다.
Reliable Delta Compressed가 정렬되어 집니다. 패킷은 항상 그들이 보내진 순서대로 받게 됩니다. 하나의 패킷을 잃으면 그 패킷은 다시 보내질 것입니다. 모든 이후의 패킷들은 그 이전의 패킷이 받아질 때까지 큐에서 기다리게 됩니다. 마지막 전송 값과 현재 값 사이의 차이만이 보내지고 아무런 차이가 없다면 아무것도 보내지지 않습니다.
하나의 스크립트를 관찰하고 있다면 사용자는 명확하게 스크립트 안에서 데이터를Serialize해야 합니다. 사용자는 OnSerializeNetworkView()함수 안에서 이것을 합니다.
function OnSerializeNetworkView (stream : BitStream, info : NetworkMessageInfo) { var horizontalInput : float = Input.GetAxis ("Horizontal"); stream.Serialize (horizontalInput); }
스트림으로 쓰는 변수로 부터 업데이트와 읽은 것을 받게 될 때 위의 함수는 항상horizontalInput으로 씁니다 (스크림으로 부터 업데이트). 사용자가 업데이트를 받거나 또는 보낼 때 다른 것들을 하기를 원한다면 사용자는 BitStream 클래스의isWriting 속성을 사용할 수 있습니다.
function OnSerializeNetworkView (stream : BitStream, info : NetworkMessageInfo) { var horizontalInput : float = 0.0; if (stream.isWriting) { // Sending horizontalInput = Input.GetAxis ("Horizontal"); stream.Serialize (horizontalInput); } else { // Receiving stream.Serialize (horizontalInput); // ... do something meaningful with the received variable } }
OnSerializeNetworkView는 네트워크 매니저 프로젝트 세팅에서 지정된 sendRate에 따라서 불려집니다. 기본적으로 이것은 시간당 15 타임즈 입니다.
사용자가 사용자의 스크립트에서Remote Procedure Calls를 사용하기를 원한다면 사용자가 필요한 모든 것은 스크립트가 부착된 같은GameObject안에 있는NetworkView 컴포넌트 입니다. NetworkView는 다른 것을 위해서도 사용될 수 있거나 또는 그것이 오직 RPCs를 보내기를 위해서만 사용되는 경우에 그것은 관찰된 스크립트를 가지지 않을 수 있고state synchronization도 꺼지게 할 수 있습니다. 네트워크에서 불려질 수 있는 함수는 @RPC 속성을 가져야만 합니다. 같은GameObject에 부착된 어떠한 스크립트로 부터도 사용자는Remote Procedure Call을 실행하기 위해서 networkView.RPC()를 부릅니다.
var playerBullet : GameObject; function Update () { if (Input.GetButtonDown ("Fire1")) { networkView.RPC ("PlayerFire", RPCMode.All); } } @RPC function PlayerFire () { Instantiate (playerBullet, playerBullet.transform.position, playerBullet.transform.rotation); }
RPCs는 신뢰성있게 전송되고 순차적으로 됩니다. RPCs에 대한 더 많은 정보를 위해서 RPC Details 페이지를 살펴주세요.
Hints
- 사용자가 네트워크 뷰를 어떻게 사용하는지에 대해 확실하지 않다면 Network Reference Guide 통해서 읽어보시기 바랍니다.
- State Synchronization은Remote Procedure Calls를 사용하기 위해서 비활성화될 필요는 없습니다.
- If 사용자가 하나 이상의 네트워크 뷰를 가지고 특정한 것 위에서 하나의RPC를 콜하고 싶다면GetComponents(NetworkView)[i].RPC()를 사용하시기 바랍니다.
- 출처: 유니티코리아위키 (CC BY-NC-SA 2.0)