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必须由服务端去修改

posted @ 2024-02-29 16:23  被迫吃冰淇淋的小学生  阅读(313)  评论(0)    收藏  举报