5.Unity-Mirror网络框架基础
简介:
Mirror是一个开源Unity网络框架,可用于快速开发联机项目。
Mirror项目地址::https://github.com/vis2k/Mirror
文档:https://mirror-networking.gitbook.io/docs/
官方提供了很多demo ,先从Tanks的demo入门。
打开项目的Tanks文件夹中的Scene,打包即可测试联机

1.NetworkManager
NetworkManager作为项目网络连接的核心。
NetworkManager的Inspector面版有两个比较核心的配置:
一是PlayerPrefab,当玩家连接成功时,生成的玩家对象。
二是OnlineScene,联网时的网络场景。
使用NetworkManager启动:
NetworkManager.StartClient(); //启动客户端
NetworkManager.StartHost(); //启动服务器
NetworkManagerStartHostClient(); //启动服务器&客户端

2.NetworkBehaviour介绍
NetworkBehaviour 作为网络对象的基本类 ,继承NetworkBehaviour的类可以接收和发送网络命令。
基本生命周期 :
OnStartServer() //服务器端玩家启动时
OnStartLocalPlayer() //本地客户端启动时执行
OnStartClient() //客户端启动时执行
OnStopClient() //结束 或 断开连接时执行

3.NetworkBehaviour对象的网络交互方式
NetworkBehaviour中有两个主要使用的特性
[Command] :Client->Server , 标记在客户端通知服务端的方法。
[ClientRpc]:Server->Client (多个), 标记在服务端向客户端们转发的方法。
以Tanks中坦克开火例子
[Command]
void CmdFire()
{//1. 在服务端中生成子弹
GameObject projectile = Instantiate(projectilePrefab, position, transform.rotation);
//2. 将生成的子弹 广播给玩家(玩家:指发射子弹的坦克)
NetworkServer.Spawn(projectile);
//3.将播放动画 广播给玩家
RpcOnFire();
}[ClientRpc]
void RpcOnFire()
{
animator.SetTrigger("Shoot");
}
4.[Sycn] 值同步
类似于血量,攻击力之类是数值需要同步给多端时,可以使用[sync]标记在字段上。
当字段被sync]标记时, 相当于该字段被放于服务器上,服务器将会不断地把数值发送给客户端,达到值同步。
更改血量示例代码
[sync]
int Hp;
[Command]
void OnChangeHp(int change){
Hp+=change;
}
此外还可以利用hook做值变化监听,如
[SyncVar(hook =nameof(OnValueChange))]
int Hp;
void OnValueChange(int oldHp ,int newHp)
{
Debug.Log($"血量变化{oldHp}->{newHp}");
}

5.一些常用的方法
通过netId查找对象
NetworkIdentity.spawned[netId]
获取本地玩家
NetworkClient.localPlayer
注册已生成对象到服务端
NetworkServer.Spawn(player);
切换场景
NetworkManager.singleton.ServerChangeScene("OtherScene");
授予Authority权限
NetworkIdentity id = target.GetComponent<NetworkIdentity>();
id.AssignClientAuthority(NetworkClient.localPlayer.connectionToClient);
6.其他
为了方便联机测试,可以使用
Unity多开插件:https://github.com/VeriorPies/ParrelSync/
个人联机Demo试玩: https://share.weiyun.com/19CVbJoU