在 Unity 的 Mirror 网络框架中,提供了很多用于管理网络连接、同步状态、消息传递等的 API。以下是一些 Mirror 网络框架的常用方法和功能介绍,帮助你更好地理解如何使用它们来构建多玩家游戏。
1. NetworkManager 类
NetworkManager
是 Mirror
网络的核心类,管理网络会话、玩家连接、场景切换等功能。你通常会继承 NetworkManager
来定制你的服务器和客户端行为。
常用方法:
-
StartHost()
启动一个主机并创建一个服务器和客户端。通常在本地启动一个游戏并进行连接时使用。NetworkManager.singleton.StartHost();
-
StartClient()
启动客户端并连接到已经运行的服务器。NetworkManager.singleton.StartClient();
-
StartServer()
启动一个独立的服务器并等待客户端连接。NetworkManager.singleton.StartServer();
-
StopHost() / StopClient() / StopServer()
停止主机、客户端或服务器。NetworkManager.singleton.StopHost();
-
ServerChangeScene(string sceneName)
在服务器上切换场景,并通知所有客户端切换场景。NetworkManager.singleton.ServerChangeScene("GameScene");
-
OnServerAddPlayer(NetworkConnection conn)
当一个新玩家连接时,NetworkManager
会自动调用这个方法。你可以在这里自定义如何处理玩家的加入。public override void OnServerAddPlayer(NetworkConnection conn) { // 自定义玩家加入逻辑 base.OnServerAddPlayer(conn); }
2. NetworkIdentity 类
NetworkIdentity
是用于标识网络实体(例如玩家、物体等)的组件。它包含了每个对象的唯一标识符(NetworkID)和同步信息。
常用方法:
-
isLocalPlayer
检查当前对象是否是本地玩家对象。if (isLocalPlayer) { // 只在本地玩家对象上执行某些操作 }
-
isServer / isClient
检查当前对象是否是服务器端或客户端。if (isServer) { // 只有在服务器端运行的代码 }
-
netId
获取当前对象的唯一网络 ID。NetworkIdentity networkIdentity = GetComponent<NetworkIdentity>(); Debug.Log("This object's network ID: " + networkIdentity.netId);
3. NetworkBehaviour 类
NetworkBehaviour
是用于在网络游戏中处理与网络相关的行为的基类。你通常会继承这个类来编写玩家控制、同步等逻辑。
常用方法:
-
Cmd(Command)
从客户端调用并在服务器上执行的方法。必须加上[Command]
特性。[Command] public void CmdMove(Vector3 position) { transform.position = position; // 服务器上执行 }
-
Rpc(ClientRpc)
从服务器调用并在所有客户端上执行的方法。必须加上[ClientRpc]
特性。[ClientRpc] public void RpcUpdateScore(int score) { // 所有客户端都执行 }
-
TargetRpc
从服务器调用并在指定客户端上执行的方法。[TargetRpc] public void TargetUpdateScore(NetworkConnection target, int score) { // 只有指定的客户端执行 }
4. NetworkTransform 类
NetworkTransform
用于在多个客户端之间同步物体的位置、旋转和缩放。它会自动将变换信息发送到网络。
常用方法:
-
SetDirtyBit()
手动标记物体为“脏”状态,表示该物体的状态需要同步给其他客户端。通常在修改物体位置或旋转时使用。networkTransform.SetDirtyBit(1);
-
OnSerialize()
自定义同步物体的状态。当你需要控制如何同步数据时,重写这个方法。public override bool OnSerialize(NetworkWriter writer, bool initialState) { writer.WriteFloat(transform.position.x); writer.WriteFloat(transform.position.y); return true; }
5. NetworkConnection 类
NetworkConnection
表示一个与服务器或客户端的网络连接。你可以使用它来发送消息、断开连接等。
常用方法:
-
Send()
发送消息到网络连接。你可以使用NetworkWriter
来构建消息,并通过Send()
方法发送给其他客户端或服务器。NetworkWriter writer = new NetworkWriter(); writer.WriteInt32(100); conn.Send(MyCustomMessage.MsgType, writer);
-
Disconnect()
断开网络连接。conn.Disconnect();
6. NetworkServer 类
NetworkServer
用于在服务器端处理客户端的连接、消息、同步等功能。
常用方法:
-
AddPlayer()
将玩家对象添加到服务器中。NetworkServer.AddPlayerForConnection(conn, playerPrefab);
-
Disconnect()
断开指定连接的玩家。NetworkServer.Disconnect(conn);
7. NetworkClient 类
NetworkClient
用于客户端连接到服务器、发送消息和接收服务器的响应。
常用方法:
-
Connect()
客户端连接到指定的服务器。NetworkClient.Connect("localhost");
-
Send()
向服务器发送消息。NetworkClient.Send(MyCustomMessage.MsgType, writer);
-
Disconnect()
客户端断开与服务器的连接。NetworkClient.Disconnect();
8. NetworkTransformChild 类
NetworkTransformChild
使得子对象(通常是一个玩家角色的装备或子物体)可以通过网络同步。它通常用于同步一些依赖父物体的动态子物体。
常用方法:
-
SyncPosition
用于同步子物体的位置。networkTransformChild.SyncPosition = true;
总结
Mirror 网络框架的核心组件和方法提供了很大的灵活性来管理多人游戏的网络通信与同步。常见的操作包括启动客户端和服务器、在客户端和服务器之间发送命令与回调、同步玩家和物体的状态,以及处理客户端连接和断开等。
通过组合这些功能,你可以轻松实现网络游戏中的各种操作,譬如玩家匹配、房间管理、实时互动等。