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