(此类属于旧网络系统,已弃用。请参阅 NetworkIdentity 以了解新网络系统)。
__网络视图__是在 Unity 中创建联网多人游戏的门户。它们易于使用,但功能非常强大。因此,在开始尝试使用网络视图之前,建议您了解网络背后的基本概念。您可以在网络参考指南中学习和探索这些基本概念。
为了使用任何网络功能,包括__状态同步 (State Synchronization)__ 或__远程过程调用 (Remote Procedure Calls)__,您的__游戏对象__必须连接网络视图。
属性: | 功能: |
---|---|
State Synchronization | 此网络视图使用的状态同步 (State Synchronization) 类型 |
        Off | 不使用状态同步 (State Synchronization)。如果您只想发送 RPC,那么这是最佳选项 |
        Reliable Delta Compressed | 仅发送上次状态和当前状态之间的差异,如果没有任何改变,则不发送任何内容。此模式是有序的。在丢包的情况下,自动重新发送丢失的数据包 |
        Unreliable | 发送完整状态。这种情况会占用更多带宽,但最大限度降低了丢包的影响 |
Observed | 通过网络发送的__组件__数据 |
View ID | 此网络视图的唯一标识符。这些值在检视面板中为只读值 |
        Scene ID | 网络视图在此特定场景中的数字 ID |
Type | 在运行时保存到 Scene 或 Allocated |
将网络视图添加到游戏对象时,必须决定两件事
1.您希望网络视图发送哪种数据 1.您希望如何发送该数据
网络视图的 Observed 属性可包含单个组件。此组件可以是 Transform、Animation、RigidBody 或脚本。无论 Observed 组件是什么,都会通过网络发送其相关数据。您可以从下拉菜单中选择组件,也可以将任何组件标题直接拖到变量中。如果您不想直接发送数据,只想使用 RPC 调用,则可关闭同步(不直接发送数据),并且不需要为 Observed 属性设置值。RPC 调用只需要一个网络视图,因此如果已存在一个视图,则无需专门为 RPC 添加视图。
您可以通过 2 个选项发送 Observed 组件的数据:__State Synchronization__ 和 Remote Procedure Calls。
要使用 State Synchronization,请将网络视图的 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) {
// 发送
horizontalInput = Input.GetAxis ("Horizontal");
stream.Serialize (horizontalInput);
} else {
// 接收
stream.Serialize (horizontalInput);
// ...用收到的变量执行一些有意义的操作
}
}
}
C# 脚本示例
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);
// ...用收到的变量执行一些有意义的操作
}
}
JS 脚本示例
OnSerializeNetworkView 的调用是根据 Network Manager 项目设置中指定的 sendRate 进行的。默认为 15 次/秒。
如果要在脚本中使用远程过程调用,则只需要有一个 NetworkView 组件存在于脚本所连接到的同一游戏对象中。NetworkView 可用于其他目的,如果仅用于发送 RPC,它可以不监视脚本(Observed 属性不用设值)并可关闭状态同步。要从网络调用的函数必须具有 @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 详细信息页面。