Mirror网络框架
生命周期
Unity.Awake->Unity.Start->Mirror.OnStart
Client=>Server
1.Command
客户端调用服务端方法
[Command]//让服务端运行某方法
CmdFunc(T value) { }
2.权限问题(脚本需要使用Command)
1.父物体必须拥有NetworkIdentity组件,脚本继承NetworkBehaviour
2.物体必须加入NetworkManager预制体的Registered Spawn Prefabs列表
3.让Sync脚本或其子脚本通知服务器,去创建物体
4.物体的首次使用Command,不能在Awake中
Command案例
----------PlayerManager---------
//在PlayerManager的OnAwake进行方法注册
public override void OnAwake()
{
EventManager.Instance.RegisterEvent(Common.EventType.OnClientStart, LoadPlayer);
}
//等待客户端连上服务端后的回调
private void LoadPlayer()
{
Sync.Instance.player.CmdLoadPlayer();
}
----------PlayerManager---------
----------Sync : NetworkBehaviour---------
public static Sync Instance;
public SyncPlayer player;
//服务端回调,此时各种通信已准备就绪
public override void OnStartLocalPlayer()
{
Instance = this;
player = GetComponentInChildren<SyncPlayer>();
EventManager.Instance.PostEvent(Common.EventType.OnClientStart);
}
----------Sync : NetworkBehaviour---------
----------SyncPlayer : NetworkBehaviour---------
//服务端创建对象,同时让所有客户端也创建
[Command]
public void CmdLoadPlayer()
{
GameObject go = Instantiate(Resources.Load<GameObject>("Prefabs/Player"));
NetworkServer.Spawn(go, connectionToClient);
}
----------SyncPlayer : NetworkBehaviour---------
//最后就是在Player身上的脚本,要使用的Command不能在Awake里,其他都能用
//当该客户端断开连接时,服务端和其他客户端的该Player也会被销毁
Server=>Client
服务端调用客户端方法
1.Rpc
Remote Procedure Call
必须加上RpcXXX
//1.向自己广播
[TargetRpc]
RpcSelfFunc(T value) { }
//2.向目标广播target = XXX.GetComponent<NetworkIdentity>().connectionToClient
[TargetRpc]
RpcTargetFunc(NetworkConnectionToClient target, T value) { }
//3.向所有对象广播
[ClientRpc]
RpcAllFunc(T value) { }
//4.向除自己之外的对象广播
[ClientRpc(includeOwner = false)]
RpcOtherFunc(T value) { }
2.SyncVar
同步变量
顾名思义,每个对象需要同步的变量
例如玩家名字,当用户加入房间后,需要得到其他玩家的名字,虽然Cmd+Rpc也能写,但会麻烦很多
[SyncVar(hook = nameof(OnMsgChanged))]
public string msg;
public void OnMsgChanged(string _Old, string _New)
{
Debug.Log(_Old + _New);
}
其中,msg必须由服务端去修改

浙公网安备 33010602011771号