Network Level Loading

아래는 멀티 플레이어 게임에서 하나의 레벨을 로드하기 위한 방법의 간단한 예입니다. 그것은 레벨이 로드되어 지고 있는 동안 네트워크 메세지가 처리되는 것이 없음을 확실시 합니다. 그것은 모든 것이 준비될 때까지 어떠한 메세지도 보내지지 않음을 확실시 합니다. 마지막으로 레벨이 로드될 때, 그것은 그들이 레벨이 로드되어 것을 알게 하고 그것에 대응할 수 있도록 모든 스크립트에게 메세지를 보냅니다. SetLevelPrefix 함수는 새로이 로드된 레벨로부터 원치 않는 네트워크 업데이트를 막는 것을 돕습니다. 예를 들어 원치 않는 업데이트는 이전 레벨로 부터의 업데이트일지도 모릅니다. 이 예는 또한 게임 데이터를 분리하기 위해 그룹을 사용하고 그룹들에게 커뮤니케이션을 로드합니다. 그룹 0은 게임 데이터 트래픽과 레벨 로딩을 위한 그룹 1을 위해서 사용됩니다. 그룹 0은 레벨이 로딩되어지고 있는 동안 차단되나 그룹 1은 오픈된 상태로 있습니다. 그것은 또한 레벨 로딩동안 오픈된 상태로 있을 수 있기 위해서 채팅 커뮤니케이션을 전달할 수 있습니다.

var supportedNetworkLevels : String[] = [ "mylevel" ];
var disconnectedLevel : String = "loader";
private var lastLevelPrefix = 0;
 
function Awake ()
{
    // Network level loading is done in a separate channel.
    DontDestroyOnLoad(this);
    networkView.group = 1;
    Application.LoadLevel(disconnectedLevel);
}
 
function OnGUI ()
{
	if (Network.peerType != NetworkPeerType.Disconnected)
	{
		GUILayout.BeginArea(Rect(0, Screen.height - 30, Screen.width, 30));
		GUILayout.BeginHorizontal();
 
		for (var level in supportedNetworkLevels)
		{
			if (GUILayout.Button(level))
			{
				Network.RemoveRPCsInGroup(0);
				Network.RemoveRPCsInGroup(1);
				networkView.RPC( "LoadLevel", RPCMode.AllBuffered, level, lastLevelPrefix + 1);
			}
		}
		GUILayout.FlexibleSpace();
		GUILayout.EndHorizontal();
		GUILayout.EndArea();
	}
}
 
@RPC
function LoadLevel (level : String, levelPrefix : int)
{
	lastLevelPrefix = levelPrefix;
 
		// There is no reason to send any more data over the network on the default channel,
		// because we are about to load the level, thus all those objects will get deleted anyway
		Network.SetSendingEnabled(0, false);	
 
		// We need to stop receiving because first the level must be loaded first.
		// Once the level is loaded, rpc's and other state update attached to objects in the level are allowed to fire
		Network.isMessageQueueRunning = false;
 
		// All network views loaded from a level will get a prefix into their NetworkViewID.
		// This will prevent old updates from clients leaking into a newly created scene.
		Network.SetLevelPrefix(levelPrefix);
		Application.LoadLevel(level);
		yield;
		yield;
 
		// Allow receiving data again
		Network.isMessageQueueRunning = true;
		// Now the level has been loaded and we can start sending out data to clients
		Network.SetSendingEnabled(0, true);
 
 
		for (var go in FindObjectsOfType(GameObject))
			go.SendMessage("OnNetworkLoadedLevel", SendMessageOptions.DontRequireReceiver);	
}
 
function OnDisconnectedFromServer ()
{
	Application.LoadLevel(disconnectedLevel);
}
 
@script RequireComponent(NetworkView)

역링크