Unity3d網絡總結(一) NetWork組件使用

      學習Unity3d的過程當中,常常上網查閱各位大牛的博客,受益不淺,從今天開始寫本身在學習過程當中遇到的問題,總結概括下來,方便往後複習服務器

這兩天在學習Unity的網絡模塊,今天先總結Unity自帶的Network組件相關使用方法網絡

1.網絡管理物體ide

搭建網絡,須要先建立一個空物體用來添加網絡管理組件,首先要給空物體添加如下兩個組件學習

注意事項: 1. OffLine Scene表明客戶端鏈接服務器前,等待的場景(遊戲大廳)動畫

.                   OnLine Scene表明客戶端鏈接服務器後的場景 (遊戲場景)spa

                  2.Spawn Info 服務器卵生信息 :  把網絡預設體(必須掛有網絡組件) 拖入PlayerPrefab , 服務器會把遊戲對象孿生到全部鏈接的客戶端中pwa

二.遊戲對象3d

1.Network Identitycode

      遊戲對象(網絡預設體)須要掛Network Identity組件,該組件是網絡的核心,由服務器Spwan(卵生)的物體都必須具有,該組件在卵生的時候會自動分配assetID和權限orm

注意事項:1.ServerOnly 勾選後物體只在服務器中存在

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

2.實現狀態同步

 遊戲對象的控制腳本須要繼承NetWorkBehaviour組件(依賴於NetWorkIdentity),用來實現RPC技術和狀態同步屬性.
1.Transform同步
這個組件負責玩家對象在客戶端發出移動指令後,把該玩家的移動同步到全部客戶端中

注意事項:1.Net Work Send Rate 表示同步Transform的頻率

                2.Transform Synv Mode 表示同步的模式,能夠選擇同步剛體組件,角色控制器等

而後在控制腳本編寫代碼

public class ControlMove : NetworkBehaviour {
   
    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.全部網絡控制腳本必需要繼承 NetWorkBehaviour

                                       2.在Update裏須要先判斷是不是本地客戶端,不是的話Return~!!!  若是沒有這個判斷條件,在客戶端發出指令,網絡裏全部的客戶端都會執行

 2.發射子彈與減血的同步

   通過上邊的步驟,已經能夠實現物體在網絡裏的移動,但咱們想要實如今網絡裏發射子彈,受到攻擊後還要減血,這些指令都須要在服務器上執行,先來看一下NetWorkBehaviour的經常使用特性

[SyncVar]    用於標識序列化變量,實現變量同步             例: (把Hp標識,就能夠實現同步減血)

[Client]        表示只能在客戶端調用

[ClientCallBack]   表示客戶端執行的回調

[Command]  表示客戶端向服務端發送的命令,在服務端執行

[ClientPrc]  表示服務端向客戶端發送的命令,在客戶端執行

直接來看代碼如何使用:

 //將血量設置爲網絡同步變量
    [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由服務器執行
    //前綴必須是Cmd 開頭
    [Command]
    public void CmdReduceHp()
    {
        hp -= 10;
    }
     //發射子彈的方法
    [Command]
    public void CmdFire()
    {
        GameObject a= Instantiate(bullet, transform.position+transform.right, Quaternion.identity);
        a.GetComponent<Rigidbody>().AddForce(transform.right*100);   //給子彈添加向右的力
        NetworkServer.Spawn(a);   //由服務器卵生給鏈接的客戶端
    }

注意事項:1.網絡預設體須要先在客戶端場景裏註冊一下,才能正常產生              

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

               3.Command修飾的方法,由客戶端發起,服務端執行,方法名前必須加Cmd

               4.監聽鍵盤事件的Iput.GetKeyDown要放在Update裏,不能放在Cmd方法裏!!!  (此時方法由服務器調用,沒法監聽鍵盤事件)

3.動畫的同步

   要實現遊戲對象的動畫同步,還須要添加一個網絡組件,並給組件指定Animator,並勾選Animator裏包含的動畫.

 

動畫同步須要注意一點,過分條件是Trigger時須要由客戶端發起指令,在服務端執行,再分發給各個客戶端執行,其餘條件正常.

這裏Animator的兩個動畫,attack01條件是bool,attack02條件是Trigger ,代碼以下:

    Animator ani;  
    void Start()
    {
        ani = GetComponent<Animator>();
    }
     void Update () {
     if (Input.GetKeyDown(KeyCode.Q)) 
        {
            ani.SetBool("attack01", !ani.GetBool("attack01"));        
        }
        if (Input.GetKeyDown(KeyCode.E))
        {
            CmdAttack02();
        }
    }
    [Command]    //服務器執行
    void CmdAttack02()
    {
        RpcPlayTrigger();
    }
    [ClientRpc]   //由服務器端調用,在客戶端執行 
    void RpcPlayTrigger()
    {
        ani.SetTrigger("attack02");
    }

     我的總結,之後學習到新的技術,堅持寫下來,方便複習

相關文章
相關標籤/搜索