Unity3d網(wǎng)絡(luò)通信 - NetWork組件使用
習(xí)Unity3d的過(guò)程中,經(jīng)常上網(wǎng)查閱各位大牛的博客,受益匪淺,從今天開始寫自己在學(xué)習(xí)過(guò)程中遇到的問(wèn)題,總結(jié)歸納下來(lái),方便日后復(fù)習(xí)
這兩天在學(xué)習(xí)Unity的網(wǎng)絡(luò)模塊,今天先總結(jié)Unity自帶的Network組件相關(guān)使用方法
一.網(wǎng)絡(luò)管理物體
搭建網(wǎng)絡(luò),需要先創(chuàng)建一個(gè)空物體用來(lái)添加網(wǎng)絡(luò)管理組件,首先要給空物體添加以下兩個(gè)組件
注意事項(xiàng): 1. OffLine Scene代表客戶端連接服務(wù)器前,等待的場(chǎng)景(游戲大廳)
. OnLine Scene代表客戶端連接服務(wù)器后的場(chǎng)景 (游戲場(chǎng)景)
2.Spawn Info 服務(wù)器卵生信息 : 把網(wǎng)絡(luò)預(yù)設(shè)體(必須掛有網(wǎng)絡(luò)組件) 拖入PlayerPrefab , 服務(wù)器會(huì)把游戲?qū)ο髮\生到所有連接的客戶端中
二.游戲?qū)ο?/strong>
1.Network Identity
游戲?qū)ο?網(wǎng)絡(luò)預(yù)設(shè)體)需要掛Network Identity組件,該組件是網(wǎng)絡(luò)的核心,由服務(wù)器Spwan(卵生)的物體都必須具備,該組件在卵生的時(shí)候會(huì)自動(dòng)分配assetID和權(quán)限
注意事項(xiàng):1.ServerOnly 勾選后物體只在服務(wù)器中存在
2.Local Player Authority勾選后在客戶端中存在
2.實(shí)現(xiàn)狀態(tài)同步
注意事項(xiàng):1.Net Work Send Rate 表示同步Transform的頻率
2.Transform Synv Mode 表示同步的模式,可以選擇同步剛體組件,角色控制器等
然后在控制腳本編寫代碼
void Update() { if (!isLocalPlayer) //判斷是否是本地客戶端 { return; } float x = Input.GetAxis("Horizontal"); float y = Input.GetAxis("Vertical"); if (x != 0 || y != 0) { transform.position += new Vector3(x, 0, y); } }
注意事項(xiàng) 1.所有網(wǎng)絡(luò)控制腳本必須要繼承 NetWorkBehaviour
2.在Update里需要先判斷是否是本地客戶端,不是的話Return~!!! 如果沒(méi)有這個(gè)判斷條件,在客戶端發(fā)出指令,網(wǎng)絡(luò)里所有的客戶端都會(huì)執(zhí)行
2.發(fā)射子彈與減血的同步
經(jīng)過(guò)上邊的步驟,已經(jīng)可以實(shí)現(xiàn)物體在網(wǎng)絡(luò)里的移動(dòng),但我們想要實(shí)現(xiàn)在網(wǎng)絡(luò)里發(fā)射子彈,受到攻擊后還要減血,這些指令都需要在服務(wù)器上執(zhí)行,先來(lái)看一下NetWorkBehaviour的常用特性
[SyncVar] 用于標(biāo)識(shí)序列化變量,實(shí)現(xiàn)變量同步 例: (把Hp標(biāo)識(shí),就可以實(shí)現(xiàn)同步減血)
[Client] 表示只能在客戶端調(diào)用
[ClientCallBack] 表示客戶端執(zhí)行的回調(diào)
[Command] 表示客戶端向服務(wù)端發(fā)送的命令,在服務(wù)端執(zhí)行
[ClientPrc] 表示服務(wù)端向客戶端發(fā)送的命令,在客戶端執(zhí)行
直接來(lái)看代碼如何使用:
//將血量設(shè)置為網(wǎng)絡(luò)同步變量 [SyncVar] float hp = 100; public Slider slider; //顯示血量的血條 public GameObject bullet; //子彈預(yù)設(shè)體 void Start () { ClientScene.RegisterPrefab(bullet); //在場(chǎng)景注冊(cè)預(yù)設(shè)體 } void Update () { // 2.將血量的值賦給slider slider.value = hp / 100f; if (!isLocalPlayer) { return; } if (Input.GetKeyDown(KeyCode.Q)) { CmdReduceHp(); } if (Input.GetKeyDown(KeyCode.T)) { CmdFire(); } } //減血的方法 標(biāo)識(shí)為Command由服務(wù)器執(zhí)行 //前綴必須是Cmd 開頭 [Command] public void CmdReduceHp() { hp -= 10; } //發(fā)射子彈的方法 [Command] public void CmdFire() { GameObject a= Instantiate(bullet, transform.position+transform.right, Quaternion.identity); a.GetComponent().AddForce(transform.right*100); //給子彈添加向右的力 NetworkServer.Spawn(a); //由服務(wù)器卵生給連接的客戶端 }
注意事項(xiàng):1.網(wǎng)絡(luò)預(yù)設(shè)體需要先在客戶端場(chǎng)景里注冊(cè)一下,才能正常產(chǎn)生
2.hp賦值給Slider要寫在判斷是否是本地客戶端前,血條才會(huì)正常同步顯示
3.Command修飾的方法,由客戶端發(fā)起,服務(wù)端執(zhí)行,方法名前必須加Cmd
4.監(jiān)聽(tīng)鍵盤事件的Iput.GetKeyDown要放在Update里,不能放在Cmd方法里!!! (此時(shí)方法由服務(wù)器調(diào)用,無(wú)法監(jiān)聽(tīng)鍵盤事件)
3.動(dòng)畫的同步
要實(shí)現(xiàn)游戲?qū)ο蟮膭?dòng)畫同步,還需要添加一個(gè)網(wǎng)絡(luò)組件,并給組件指定Animator,并勾選Animator里包含的動(dòng)畫.
動(dòng)畫同步需要注意一點(diǎn),過(guò)度條件是Trigger時(shí)需要由客戶端發(fā)起指令,在服務(wù)端執(zhí)行,再分發(fā)給各個(gè)客戶端執(zhí)行,其他條件正常.
這里Animator的兩個(gè)動(dòng)畫,attack01條件是bool,attack02條件是Trigger ,代碼如下:
Animator ani; void Start() { ani = GetComponent(); } void Update () { if (Input.GetKeyDown(KeyCode.Q)) { ani.SetBool("attack01", !ani.GetBool("attack01")); } if (Input.GetKeyDown(KeyCode.E)) { CmdAttack02(); } } [Command] //服務(wù)器執(zhí)行 void CmdAttack02() { RpcPlayTrigger(); } [ClientRpc] //由服務(wù)器端調(diào)用,在客戶端執(zhí)行 void RpcPlayTrigger() { ani.SetTrigger("attack02"); }希望對(duì)UNITY愛(ài)好者有拋磚引玉的療效,敬請(qǐng)關(guān)注WISEGLOVE獲取更多UNITY精華。聲明: 本文轉(zhuǎn)自網(wǎng)絡(luò), 不做盈利目的,如有侵權(quán),請(qǐng)與我們聯(lián)系處理,謝謝。
- 上一篇:unity3d的網(wǎng)絡(luò)套接字SOCKET模塊使用 2019/6/12
- 下一篇:通過(guò)UE4 的 INTEL REALSENSE 插件以新的方 2019/5/28