网络视图

网络视图 (Network View) 是 Unity 中制作网络多人游戏的网关。网络视图使用起来很简单,但功能却非常强大。由于这个原因,我们建议在您开始使用网络视图 (Network View) 功能之前先了解网络的基本概念。您可以在状态同步类型。 关闭 (Off)“状态同步”(State Synchronization) 功能未使用。如果您只想发送 RPCs,那这是最佳选择 可靠的差值压缩 (Reliable Delta Compressed)会发送前一个状态和当前状态之间的差值。如果没有任何更改,则不发送任何东西。这种模式是有序的。如果数据包丢失,会自动重新发送该数据包 不可靠 (Unreliable)将发送完整状态。这会使用更多的带宽,但数据包丢失造成的影响降到了最低 观察数据 (Observed)将在网络上发送的组件 (Component) 数据 视图 ID (View ID)该“网络视图”(Network View) 的唯一识别符。这些值在“检视器”(Inspector) 中是只读的 场景 ID (Scene ID)网络视图”(Network View)在该特定场景中的数字 ID 类型 (Type)保存到场景 (Scene) 或或在运行时分配 (Allocated)

详细信息

当将“网络视图”(Network View) 添加到“游戏对象”(GameObject) 时,您必须确定两样东西

  1. 需要“网络视图”(Network View) 发送什么样的数据
  2. 需要如何发送该数据

选择要发送的数据

“网络视图”(Network View) 的观察数据 (Observed) 属性可以包含单个组件 (Component)。变换组件 (Transform)动画 (Animation)刚体 (RigidBody) 或者脚本。无论观察数据 (Observed) 组件是什么,其相关数据都将通过网络发送。您可以从下拉菜单中选择一个组件 (Component),或直接将任一组件 (Component) 页眉拖到变量。如果不直接发送数据,只是使用 RPC 调用,那么可以关掉同步功能(没有直接发送的数据),并且不需要设置为“观察数据”(Observed) 属性。RPC 调用只需有单独的网络视图,因此,如果已经有了一个视图,则不需要专门为 RPC 添加视图。

如何发送数据

发送观察数据 (Observed) 组件的数据有两种方式:状态同步 (State Synchronization)远程过程调用 (Remote Procedure Calls)

要使用“状态同步”(State Synchronization) 功能,请将“网络视图”(Network View) 的状态同步 (State Synchronization) 设置为可靠的差值压缩 (Reliable Delta Compressed)不可靠 (Unreliable)观察数据 (Observed) 组件的数据将立即通过网络自动发送。

可靠的差值压缩 (Reliable Delta Compressed) 是有序的。数据包总是按其发送顺序接收。如果某个数据包丢失,则会重新发送该数据包。在前一个数据包收到之前,该数据包之后的所有数据包都会排队等待发送。只发送前一传输值和当前值的差值。如果没有差值,则不发送任何数据。

如果是在观察脚本 (Script),则必须在该脚本内明确序列化 (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) {
		// 正在发送
		horizontalInput = Input.GetAxis ("Horizontal");
		stream.Serialize (horizontalInput);
	} else {

		// 正在接收
		stream.Serialize (horizontalInput);
		// ... 用接收到的变量做有意义的事
	}
}

OnSerializeNetworkView 是根据网络管理器项目设置中指定的 sendRate 调用的。在默认情况下每秒调用 15 次。

如果想在脚本中使用“远程过程调用”(Remote Procedure Calls),只需附加有脚本的同一个“游戏对象”(GameObject) 中有网络视图 (NetworkView) 组件。“网络视图”(NetworkView) 也可用于其他地方,如果只用于发送 RPC,则没有脚本观察,并且“状态同步”(State Synchronization) 功能关闭。这个可以从网络调用的函数必须具有 @RPC 属性。现在,您可从附加到同一个“游戏对象”(GameObject) 的任何脚本调用networkView.RPC() 来执行“远程过程调用”(Remote Procedure Call)。

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);
}

RPC 得到了可靠传输并有序排列。有关 RPC 的更多详细信息,请参阅 RPC 详细信息 页面。

提示

Page last updated: 2013-06-28