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