5.Unity-Mirror網(wǎng)絡(luò)框架基礎(chǔ)
簡(jiǎn)介:
Mirror是一個(gè)開源Unity網(wǎng)絡(luò)框架,可用于快速開發(fā)聯(lián)機(jī)項(xiàng)目。
Mirror項(xiàng)目地址::https://github.com/vis2k/Mirror
文檔:https://mirror-networking.gitbook.io/docs/
官方提供了很多demo ,先從Tanks的demo入門。
打開項(xiàng)目的Tanks文件夾中的Scene,打包即可測(cè)試聯(lián)機(jī)

1.NetworkManager?
NetworkManager作為項(xiàng)目網(wǎng)絡(luò)連接的核心。
NetworkManager的Inspector面版有兩個(gè)比較核心的配置:
一是PlayerPrefab,當(dāng)玩家連接成功時(shí),生成的玩家對(duì)象。
二是OnlineScene,聯(lián)網(wǎng)時(shí)的網(wǎng)絡(luò)場(chǎng)景。
使用NetworkManager啟動(dòng):
NetworkManager.StartClient(); //啟動(dòng)客戶端
NetworkManager.StartHost(); //啟動(dòng)服務(wù)器
NetworkManagerStartHostClient(); //啟動(dòng)服務(wù)器&客戶端

2.NetworkBehaviour介紹
NetworkBehaviour 作為網(wǎng)絡(luò)對(duì)象的基本類 ,繼承NetworkBehaviour的類可以接收和發(fā)送網(wǎng)絡(luò)命令。
基本生命周期 :
OnStartServer()? //服務(wù)器端玩家啟動(dòng)時(shí)
OnStartLocalPlayer() //本地客戶端啟動(dòng)時(shí)執(zhí)行
OnStartClient() //客戶端啟動(dòng)時(shí)執(zhí)行
OnStopClient() //結(jié)束 或 斷開連接時(shí)執(zhí)行

3.NetworkBehaviour對(duì)象的網(wǎng)絡(luò)交互方式
NetworkBehaviour中有兩個(gè)主要使用的特性
[Command] :Client->Server , 標(biāo)記在客戶端通知服務(wù)端的方法。
[ClientRpc]:Server->Client (多個(gè)), 標(biāo)記在服務(wù)端向客戶端們轉(zhuǎn)發(fā)的方法。
以Tanks中坦克開火例子
[Command]
void CmdFire()
?{??? //1. 在服務(wù)端中生成子彈
????GameObject projectile = Instantiate(projectilePrefab, position, transform.rotation);
????//2. 將生成的子彈 廣播給玩家(玩家:指發(fā)射子彈的坦克)
????NetworkServer.Spawn(projectile);
????//3.將播放動(dòng)畫 廣播給玩家
????RpcOnFire();
}[ClientRpc]
void RpcOnFire()
{
????animator.SetTrigger("Shoot");
}
4.[Sycn] 值同步
類似于血量,攻擊力之類是數(shù)值需要同步給多端時(shí),可以使用[sync]標(biāo)記在字段上。
當(dāng)字段被sync]標(biāo)記時(shí), 相當(dāng)于該字段被放于服務(wù)器上,服務(wù)器將會(huì)不斷地把數(shù)值發(fā)送給客戶端,達(dá)到值同步。
更改血量示例代碼
[sync]
int Hp;
[Command]
void OnChangeHp(int change){
????Hp+=change;
}
此外還可以利用hook做值變化監(jiān)聽,如
[SyncVar(hook =nameof(OnValueChange))]
int Hp;
void OnValueChange(int oldHp ,int newHp)
{
????Debug.Log($"血量變化{oldHp}->{newHp}");
}

5.一些常用的方法
通過(guò)netId查找對(duì)象
????????NetworkIdentity.spawned[netId]
獲取本地玩家
??????? NetworkClient.localPlayer
注冊(cè)已生成對(duì)象到服務(wù)端
???????? NetworkServer.Spawn(player);
切換場(chǎng)景
????????NetworkManager.singleton.ServerChangeScene("OtherScene");
授予Authority權(quán)限
??????? NetworkIdentity id = target.GetComponent<NetworkIdentity>();
????????id.AssignClientAuthority(NetworkClient.localPlayer.connectionToClient);
????
6.其他
為了方便聯(lián)機(jī)測(cè)試,可以使用
Unity多開插件:https://github.com/VeriorPies/ParrelSync/
個(gè)人聯(lián)機(jī)Demo試玩: https://share.weiyun.com/19CVbJoU