이 클래스는 이전 네트워크 시스템의 일부이며, 지원이 중단되었습니다. 새로운 네트워킹 시스템에 대한 내용은 NetworkIdentity를 참조하십시오.
Network Views 는 Unity에서 네트워크화된 멀티플레이어 게임을 만들기 위한 게이트웨이입니다. 이 뷰는 사용하기 쉬우면서도 매우 강력합니다. 그렇기 때문에 네트워크 뷰를 실험해 보기 전에 네트워킹에 대한 기초적인 개념을 이해하는 것이 좋습니다. 네트워크 레퍼런스 가이드에서 기초적인 개념을 배우고 이해할 수 있습니다.
State Synchronization 또는 Remote Procedure Calls 같은 네트워크 기능을 사용하기 위해서는 GameObject 에 네트워크 뷰가 연결되어 있어야 합니다.
프로퍼티: | 기능: |
---|---|
State Synchronization | 이 네트워크 뷰에서 사용되는 상태 동기화 타입입니다. |
Off | 상태 동기화가 사용되지 않습니다. RPC를 전송하려는 경우에 적합한 옵션입니다. |
Reliable Delta Compressed | 최근 상태와 현재 상태의 차이만 전송됩니다. 변경된 사항이 없으면 아무것도 전송되지 않습니다. 이 모드는 순차적입니다. 패킷 손실이 발생할 경우 손실된 패킷이 자동으로 다시 전송됩니다. |
Unreliable | 전체 상태가 전송됩니다. 대역폭이 더 많이 사용되지만 패킷 손실의 영향이 최소화됩니다. |
Observed | 전체 네트워크에 걸쳐 전송될 Component 데이터입니다. |
View ID | 이 네트워크 뷰의 고유 식별자입니다. 이 값은 인스펙터에서 읽기 전용입니다. |
Scene ID | 이 특정 씬 내 네트워크 뷰의 숫자 ID입니다. |
Type | Scene 에 저장되거나 런타임 시점에 Allocated 됩니다. |
네트워크 뷰를 게임 오브젝트에 추가할 때 다음 두 가지 사항을 결정해야 합니다.
네트워크 뷰의 Observed 프로퍼티에는 단일 컴포넌트가 포함될 수 있습니다. 이 컴포넌트는 Transform, Animation 또는 RigidBody 이거나 스크립트일 수 있습니다. Observed 컴포넌트가 무엇이든 그에 관한 데이터가 네트워크를 통해 전송됩니다. 드롭다운 메뉴에서 컴포넌트를 선택하거나 컴포넌트 헤더를 변수로 직접 드래그할 수 있습니다. 데이터를 직접 전송하지 않고 RPC 호출만 사용하는 경우 동기화를 해제(데이터가 직접 전송되지 않음)할 수 있고 Observed 프로퍼티로 아무것도 설정할 필요가 없습니다. RPC 호출을 사용하려면 네트워크 뷰가 하나만 있으면 되므로 뷰가 이미 존재하는 경우 RPC를 위해 특별히 뷰를 추가하지 않아도 됩니다.
Observed 컴포넌트의 데이터를 State Synchronization 과 Remote Procedure Calls 라는 두 가지 옵션을 사용하여 전송할 수 있습니다.
상태 동기화를 사용하려면 네트워크 뷰의 State Synchronization 을 Reliable Delta Compressed 또는 Unreliable 로 설정합니다. 이제 Observed 컴포넌트의 데이터가 자동으로 네트워크를 통해 전송됩니다.
Reliable Delta Compressed 는 순차적입니다. 패킷은 항상 전송된 순서대로 수신됩니다. 패킷이 누락되면 해당 패킷이 다시 전송됩니다. 이후의 모든 패킷은 앞서 전송된 패킷이 수신될 때까지 대기열에서 대기합니다. 마지막 전송 값과 현재 전송 값의 차이만 전송되고 차이가 없으면 아무것도 전송되지 않습니다.
스크립트를 따르는 경우, 스크립트 안에서 데이터를 명시적으로 직렬화해야 합니다. 이 작업은 OnSerializeNetworkView 함수 안에서 수행합니다.
using UnityEngine;
using UnityEngine.Network;
using System.Collections;
public class ExampleScript : MonoBehaviour {
void OnSerializeNetworkView (BitStream stream, NetworkMessageInfo info) {
float horizontalInput = Input.GetAxis ("Horizontal");
stream.Serialize (horizontalInput);
}
}
C# 스크립트 예제
function OnSerializeNetworkView (stream : BitStream, info : NetworkMessageInfo) {
var horizontalInput : float = Input.GetAxis ("Horizontal");
stream.Serialize (horizontalInput);
}
JS 스크립트 예제
위 함수에서는 업데이트를 수신할 때 항상 horizontalInput에 (스트림에서 전송된 업데이트를) 쓰고, 그 외의 경우 스트림에 쓰는 변수에서 읽어옵니다. 업데이트를 수신하거나 전송할 때 다른 작업을 수행하려면 BitStream 클래스의 isWriting 특성을 사용할 수 있습니다.
using UnityEngine;
using UnityEngine.Network;
using System.Collections;
public class ExampleScript : MonoBehaviour {
void OnSerializeNetworkView (BitStream stream, NetworkMessageInfo info) {
float horizontalInput = 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
}
}
}
C# 스크립트 예제
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
}
}
JS 스크립트 예제
OnSerializeNetworkView 는 네트워크 관리자 프로젝트 설정에서 지정한 sendRate 에 따라 호출됩니다. 디폴트는 초당 15회입니다.
원격 프로시저 호출(RPC)을 스크립트에 사용하려면 스크립트가 연결된 동일한 게임 오브젝트에 NetworkView 컴포넌트가 있기만 하면 됩니다. 이 네트워크 뷰는 다른 데 사용할 수 있으며, RPC를 전송하는 데만 사용할 경우 관찰하는 스크립트가 없어도 되고 상태 동기화를 꺼도 됩니다. 네트워크에서 호출할 수 있도록 할 함수에는 @RPC 특성이 있어야 합니다. 이제 동일 게임 오브젝트에 연결된 스크립트에서 networkView.RPC()를 호출하여 원격 프로시저 호출을 실행합니다.
using UnityEngine;
using UnityEngine.Network;
using System.Collections;
public class ExampleScript : MonoBehaviour {
GameObject playerBullet;
NetworkView networkView;
void Start () {
networkView = new NetworkView ();
}
void Update () {
if (Input.GetButtonDown ("Fire1")) {
networkView.RPC ("PlayerFire", RPCMode.All);
}
}
[RPC]
void PlayerFire () {
Instantiate (playerBullet, playerBullet.transform.position, playerBullet.transform.rotation);
}
}
C# 스크립트 예제
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);
}
JS 스크립트 예제
RPC는 신뢰할 수 있는 방법으로 순서에 따라 전송됩니다. RPC에 대한 자세한 내용은 RPC 세부 정보 페이지를 참조하십시오.