中文字幕无码a片久久,亚洲日韩在线观看浪潮,人人超人人超碰超国产二区,国产人妻久久一区二区,国产人妻久久一区二区

福感科技有限公司 歡迎您!
聯(lián)系方式

    地址:北京市平谷區(qū)馬坊鎮(zhèn)金河北街17號院3號樓7層712

    電話:010-89968230

    網(wǎng)站:http://0743119.com

Unity3d網(wǎng)絡(luò)通信 - NetWork組件使用

2022-2-11 15:39:34??????點擊:

這兩天在學(xué)習(xí)Unity的網(wǎng)絡(luò)模塊,今天先總結(jié)Unity自帶的Network組件相關(guān)使用方法

一.網(wǎng)絡(luò)管理物體

搭建網(wǎng)絡(luò),需要先創(chuàng)建一個空物體用來添加網(wǎng)絡(luò)管理組件,首先要給空物體添加以下兩個組件

注意事項: 1. OffLine Scene代表客戶端連接服務(wù)器前,等待的場景(游戲大廳)

.                   OnLine Scene代表客戶端連接服務(wù)器后的場景 (游戲場景)

                  2.Spawn Info 服務(wù)器卵生信息 :  把網(wǎng)絡(luò)預(yù)設(shè)體(必須掛有網(wǎng)絡(luò)組件) 拖入PlayerPrefab , 服務(wù)器會把游戲?qū)ο髮\生到所有連接的客戶端中

二.游戲?qū)ο?/span>

1.Network Identity

      游戲?qū)ο?網(wǎng)絡(luò)預(yù)設(shè)體)需要掛Network Identity組件,該組件是網(wǎng)絡(luò)的核心,由服務(wù)器Spwan(卵生)的物體都必須具備,該組件在卵生的時候會自動分配assetID和權(quán)限

注意事項:1.ServerOnly 勾選后物體只在服務(wù)器中存在

              2.Local Player Authority勾選后在客戶端中存在

2.實現(xiàn)狀態(tài)同步

 游戲?qū)ο蟮目刂颇_本需要繼承NetWorkBehaviour組件(依賴于NetWorkIdentity),用來實現(xiàn)RPC技術(shù)和狀態(tài)同步屬性.
1.Transform同步
這個組件負(fù)責(zé)玩家對象在客戶端發(fā)出移動指令后,把該玩家的移動同步到所有客戶端中

注意事項: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)絡(luò)控制腳本必須要繼承 NetWorkBehaviour

              2.在Update里需要先判斷是否是本地客戶端,不是的話Return~!!!  如果沒有這個判斷條件,在客戶端發(fā)出指令,網(wǎng)絡(luò)里所有的客戶端都會執(zhí)行

2.發(fā)射子彈與減血的同步

經(jīng)過上邊的步驟,已經(jīng)可以實現(xiàn)物體在網(wǎng)絡(luò)里的移動,但我們想要實現(xiàn)在網(wǎng)絡(luò)里發(fā)射子彈,受到攻擊后還要減血,這些指令都需要在服務(wù)器上執(zhí)行,先來看一下NetWorkBehaviour的常用特性

[SyncVar]    用于標(biāo)識序列化變量,實現(xiàn)變量同步             例: (把Hp標(biāo)識,就可以實現(xiàn)同步減血)

[Client]        表示只能在客戶端調(diào)用

[ClientCallBack]   表示客戶端執(zhí)行的回調(diào)

[Command]  表示客戶端向服務(wù)端發(fā)送的命令,在服務(wù)端執(zhí)行

[ClientPrc]  表示服務(wù)端向客戶端發(fā)送的命令,在客戶端執(zhí)行

直接來看代碼如何使用:


//將血量設(shè)置為網(wǎng)絡(luò)同步變量
    [SyncVar]
    float hp = 100;
    public Slider slider;       //顯示血量的血條
    public GameObject bullet;   //子彈預(yù)設(shè)體
    void Start () {
        ClientScene.RegisterPrefab(bullet); //在場景注冊預(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)識為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ù)器卵生給連接的客戶端
    }


注意事項:1.網(wǎng)絡(luò)預(yù)設(shè)體需要先在客戶端場景里注冊一下,才能正常產(chǎn)生              

               2.hp賦值給Slider要寫在判斷是否是本地客戶端前,血條才會正常同步顯示

               3.Command修飾的方法,由客戶端發(fā)起,服務(wù)端執(zhí)行,方法名前必須加Cmd

               4.監(jiān)聽鍵盤事件的Iput.GetKeyDown要放在Update里,不能放在Cmd方法里!!!  (此時方法由服務(wù)器調(diào)用,無法監(jiān)聽鍵盤事件)

3.動畫的同步

   要實現(xiàn)游戲?qū)ο蟮膭赢嬐?還需要添加一個網(wǎng)絡(luò)組件,并給組件指定Animator,并勾選Animator里包含的動畫.

動畫同步需要注意一點,過度條件是Trigger時需要由客戶端發(fā)起指令,在服務(wù)端執(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]    //服務(wù)器執(zhí)行
    void CmdAttack02()
    {
        RpcPlayTrigger();
    }
    [ClientRpc]   //由服務(wù)器端調(diào)用,在客戶端執(zhí)行 
    void RpcPlayTrigger()
    {
        ani.SetTrigger("attack02");
    }
聲明:文章內(nèi)容整理來源于網(wǎng)絡(luò),版權(quán)屬于原作者,如有問題,請聯(lián)系我們!

Copyright 2019 0743119.com

福感科技有限公司 版權(quán)所有 All Rights Reserved

京ICP備20002031號

010-89968230