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