Mirror 常用组件
Mirror 是 Unity 的一个高性能、轻量级的网络库,它能够帮助开发者快速搭建网络游戏和应用程序。Mirror 提供了多个网络组件,以下是其中五个常用组件的详细介绍。
NetworkManager
介绍
NetworkManager 组件负责管理网络连接,它可以启动服务器和客户端,并处理网络连接、断开、重连等操作。同时,NetworkManager 还提供了一些事件回调函数,例如 OnServerConnect、OnClientDisconnect 等,可以方便地处理网络事件。
方法
-
StartServer()
:启动服务器。 -
StartClient()
:启动客户端。 -
StopServer()
:停止服务器。 -
StopClient()
:停止客户端。
举例子
以下是几个常见的代码例子,演示了如何使用 NetworkManager 组件:
例子 1:启动服务器和客户端
using UnityEngine;
using Mirror;
public class MyNetworkManager : NetworkManager
{
public void StartServer()
{
base.StartServer();
}
public void StartClient()
{
base.StartClient();
}
public void StopServer()
{
base.StopServer();
}
public void StopClient()
{
base.StopClient();
}
}
在这个例子中,我们创建了一个名为 MyNetworkManager 的类,并继承了 NetworkManager 组件。我们通过调用基类的 StartServer 和 StartClient 函数来启动服务器和客户端,通过调用基类的 StopServer 和 StopClient 函数来停止服务器和客户端。
NetworkIdentity
介绍
NetworkIdentity 组件用于标识网络游戏对象,它可以在网络中同步游戏对象的状态和属性。当一个游戏对象被标识为 NetworkIdentity 时,它会自动在服务器和客户端之间同步其位置、旋转、缩放、变量等属性。
方法
-
AssignClientAuthority(NetworkConnection conn)
:将网络对象的所有权分配给指定的客户端连接。 -
RemoveClientAuthority(NetworkConnection conn)
:从指定的客户端连接中移除网络对象的所有权。
举例子
以下是一个常见的例子,演示了如何使用 NetworkIdentity 组件:
例子:标识网络对象
using UnityEngine;
using Mirror;
public class MyNetworkObject : NetworkBehaviour
{
// 在网络中同步的变量
[SyncVar]
public int score;
void Start()
{
// 检查是否是本地客户端
if (isLocalPlayer)
{
// 分配客户端所有权
CmdAssignClientAuthority();
}
}
[Command]
void CmdAssignClientAuthority()
{
// 将网络对象的所有权分配给本地客户端
if (connectionToClient != null)
{
AssignClientAuthority(connectionToClient);
}
}
}
在这个例子中,我们创建了一个名为 MyNetworkObject 的类,并继承了 NetworkBehaviour 组件。我们使用 [SyncVar] 属性将 score 变量在网络中同步,并在 Start 函数中检查是否是本地客户端。如果是本地客户端,我们使用 CmdAssignClientAuthority 函数将网络对象的所有权分配给客户端。
NetworkBehaviour
介绍
NetworkBehaviour 组件用于处理网络消息,它可以在服务器和客户端之间同步游戏对象的状态和属性。当一个游戏对象被标识为 NetworkIdentity 时,它会自动在服务器和客户端之间同步其位置、旋转、缩放、变量等属性。
方法
-
Send<T>(T message, int channelId = Channels.DefaultReliable)
:向服务器或客户端发送网络消息。 -
[Command]
:用于标记一个客户端调用的远程过程调用(RPC)函数。 -
[ClientRpc]
:用于标记一个服务器调用的远程过程调用(RPC)函数。
举例子
以下是一个常见的例子,演示了如何使用 NetworkBehaviour 组件:
例子:同步游戏对象的位置和旋转
using UnityEngine;
using Mirror;
public class MyNetworkObject : NetworkBehaviour
{
// 在网络中同步的变量
[SyncVar]
public Vector3 position;
[SyncVar]
public Quaternion rotation;
void Update()
{
if (isLocalPlayer)
{
// 更新本地游戏对象的位置和旋转
position = transform.position;
rotation = transform.rotation;
}
else
{
// 同步远程游戏对象的位置和旋转
transform.position = position;
transform.rotation = rotation;
}
}
}
在这个例子中,我们创建了一个名为 MyNetworkObject 的类,并继承了 NetworkBehaviour 组件。我们使用 [SyncVar] 属性将 position 和 rotation 变量在网络中同步,并在 Update 函数中更新本地游戏对象的位置和旋转,以及同步远程游戏对象的位置和旋转。
NetworkTransform
介绍
NetworkTransform 组件用于同步游戏对象的位置、旋转和缩放等属性,它可以在服务器和客户端之间同步游戏对象的状态。当一个游戏对象被标识为 NetworkIdentity,并添加了 NetworkTransform 组件时,它会自动在服务器和客户端之间同步其位置、旋转、缩放等属性。
方法
SetDirtyBit(int dirtyBit)
:将指定的 dirty bit 设置为脏标志,以便在网络中同步。
举例子
以下是一个常见的例子,演示了如何使用 NetworkTransform 组件:
例子:同步游戏对象的位置和旋转
using UnityEngine;
using Mirror;
public class MyNetworkObject : NetworkBehaviour
{
// 在网络中同步的变量
[SyncVar]
public Vector3 position;
[SyncVar]
public Quaternion rotation;
// 添加 NetworkTransform 组件
[SerializeField]
NetworkTransform networkTransform;
void Update()
{
if (isLocalPlayer)
{
// 更新本地游戏对象的位置和旋转
position = transform.position;
rotation = transform.rotation;
// 设置 NetworkTransform 组件的脏标志
networkTransform.SetDirtyBit(1 << 0);
}
}
}
在这个例子中,我们创建了一个名为 MyNetworkObject 的类,并继承了 NetworkBehaviour 组件。我们使用 [SyncVar] 属性将 position 和 rotation 变量在网络中同步,并添加了 NetworkTransform 组件来同步游戏对象的位置、旋转和缩放等属性。在 Update 函数中,我们更新本地游戏对象的位置和旋转,并使用 SetDirtyBit 函数将 NetworkTransform 组件的脏标志设置为 1。