如何在Unity3d使用網(wǎng)絡通信 - NetWork組件
這兩天在學習Unity的網(wǎng)絡模塊,今天先總結Unity自帶的Network組件相關使用方法
一.網(wǎng)絡管理物體
搭建網(wǎng)絡,需要先創(chuàng)建一個空物體用來添加網(wǎng)絡管理組件,首先要給空物體添加以下兩個組件
注意事項: 1. OffLine Scene代表客戶端連接服務器前,等待的場景(游戲大廳)
. OnLine Scene代表客戶端連接服務器后的場景 (游戲場景)
2.Spawn Info 服務器卵生信息 : 把網(wǎng)絡預設體(必須掛有網(wǎng)絡組件) 拖入PlayerPrefab , 服務器會把游戲對象孿生到所有連接的客戶端中
二.游戲對象
1.Network Identity
游戲對象(網(wǎng)絡預設體)需要掛Network Identity組件,該組件是網(wǎng)絡的核心,由服務器Spwan(卵生)的物體都必須具備,該組件在卵生的時候會自動分配assetID和權限
注意事項:1.ServerOnly 勾選后物體只在服務器中存在
2.Local Player Authority勾選后在客戶端中存在
2.實現(xiàn)狀態(tài)同步
注意事項: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);
}
}
注意事項 1.所有網(wǎng)絡控制腳本必須要繼承 NetWorkBehaviour
2.在Update里需要先判斷是否是本地客戶端,不是的話Return~!!! 如果沒有這個判斷條件,在客戶端發(fā)出指令,網(wǎng)絡里所有的客戶端都會執(zhí)行
2.發(fā)射子彈與減血的同步
經(jīng)過上邊的步驟,已經(jīng)可以實現(xiàn)物體在網(wǎng)絡里的移動,但我們想要實現(xiàn)在網(wǎng)絡里發(fā)射子彈,受到攻擊后還要減血,這些指令都需要在服務器上執(zhí)行,先來看一下NetWorkBehaviour的常用特性
[SyncVar] 用于標識序列化變量,實現(xiàn)變量同步 例: (把Hp標識,就可以實現(xiàn)同步減血)
[Client] 表示只能在客戶端調用
[ClientCallBack] 表示客戶端執(zhí)行的回調
[Command] 表示客戶端向服務端發(fā)送的命令,在服務端執(zhí)行
[ClientPrc] 表示服務端向客戶端發(fā)送的命令,在客戶端執(zhí)行
直接來看代碼如何使用:
//將血量設置為網(wǎng)絡同步變量
[SyncVar]
float hp = 100;
public Slider slider; //顯示血量的血條
public GameObject bullet; //子彈預設體
void Start () {
ClientScene.RegisterPrefab(bullet); //在場景注冊預設體
}
void Update () {
// 2.將血量的值賦給slider
slider.value = hp / 100f;
if (!isLocalPlayer)
{
return;
}
if (Input.GetKeyDown(KeyCode.Q))
{
CmdReduceHp();
}
if (Input.GetKeyDown(KeyCode.T))
{
CmdFire();
}
}
//減血的方法 標識為Command由服務器執(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); //由服務器卵生給連接的客戶端
}
注意事項:1.網(wǎng)絡預設體需要先在客戶端場景里注冊一下,才能正常產(chǎn)生
2.hp賦值給Slider要寫在判斷是否是本地客戶端前,血條才會正常同步顯示
3.Command修飾的方法,由客戶端發(fā)起,服務端執(zhí)行,方法名前必須加Cmd
4.監(jiān)聽鍵盤事件的Iput.GetKeyDown要放在Update里,不能放在Cmd方法里!!! (此時方法由服務器調用,無法監(jiān)聽鍵盤事件)
3.動畫的同步
要實現(xiàn)游戲對象的動畫同步,還需要添加一個網(wǎng)絡組件,并給組件指定Animator,并勾選Animator里包含的動畫.
動畫同步需要注意一點,過度條件是Trigger時需要由客戶端發(fā)起指令,在服務端執(zhí)行,再分發(fā)給各個客戶端執(zhí)行,其他條件正常.
這里Animator的兩個動畫,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] //服務器執(zhí)行
void CmdAttack02()
{
RpcPlayTrigger();
}
[ClientRpc] //由服務器端調用,在客戶端執(zhí)行
void RpcPlayTrigger()
{
ani.SetTrigger("attack02");
}
聲明: 文章內容整理來源于網(wǎng)絡,版權屬于原作者,如有問題,請聯(lián)系我們!
- 上一篇:2020虛擬現(xiàn)實產(chǎn)業(yè)發(fā)展研究報告:2025年全球企業(yè)AR/V 2020/12/29
- 下一篇:PYTHON使用CTYPES調用DLL動態(tài)鏈接庫的方法 2020/12/28


