Unity基本網絡知識
網絡的作用: 信息交互 資源分布 分布式處理
網絡通訊協議: 七層協議:
IP地址:
每一個可以連接網絡的設備,都有自己的一個獨一無二的IP地址
NAT地址轉換:
NAT(Network Address Translation,網絡地址轉換)是1994年提出的。當在專用網內部的一些主機本來已經分配到了本地IP地址(即僅在本專用網內使用的專用地址),但現在又想和因特網上的主機通信(並不需要加密)時,可使用NAT方法。 這種方法需要在專用網連接到因特網的路由器上安裝NAT軟件。裝有NAT軟件的路由器叫做NAT路由器,它至少有一個有效的外部全球IP地址。這樣,所有使用本地地址的主機在和外界通信時,都要在NAT路由器上將其本地地址轉換成全球IP地址,才能和因特網連接。
端口:每一個端口對應一個服務 只有端口號保持一致,才能從服務器訪問到客戶端,或者客戶端訪問服務器
網絡游戲則是有多個客戶端訪問一個服務器,從服務器在傳到各個客戶端上,從而使得每個客戶端都可以看到其他幾個客戶端的部分顯示.
Unity網絡框架解析 unity的網絡框架的建立,主要是使用Unity內封裝的網絡API(HLAPI),其主要功能如下:
網絡狀態管理 [創建服務器,主機,客戶端], 狀態同步, 遠程過程調用 ,互聯網服務 [中繼服務器,游戲大廳,匹配比賽] .
Unity網絡服務器
使用Unity搭建網絡服務器,主要通過NetworkServer類實現
NetworkServer類負責創建服務器監聽接口,管理客戶端的連接,它也負責處理游戲相關的一些特性:玩家管理,監聽,卵生對象和消息處理。
Server方法:
Listen: 根據指定端口開啟服務器
RegisterHandler:注冊回調函數
Spawn:在所有已准備的客戶端上實例化物體
SpawnWithClientAuthority:同上,並且設置客戶端權限
Destroy:在所有客戶端上刪除物體
AddPlayerForConnection:將所有卵生的物體與客戶端建立關系
Server屬性
active: 檢查服務器是否開啟
connections:當前所有連接的客戶端列表
handlers:以字典的形式返回服務器注冊的所有回調方法
listenPort:服務器監聽端口
localClientActive:在服務器上的客戶端,即如果當前客戶端為主機返回為true
maxDelay:連接之間發送數據的組大延遲
創建服務器:
void InitServerAction () { //1、監聽端口並開啟服務器 NetworkServer.Listen (34567); //2、注冊響應事件,第一個參數:表示服務器為哪種類型事件注冊監聽, // 第二個參數表示,如果監聽到該事件發生的自動回調方法 // 這里監聽的是連接服務器事件,如果有客戶端連接服務器,自動 // 回調HasClientConnect方法 NetworkServer.RegisterHandler (MsgType.Connect, HasClientConnect); //3、注冊事件,如果有客戶端連接后,發出添加游戲對象的指令 NetworkServer.RegisterHandler (MsgType.AddPlayer, AddPlayer); }
Unity網絡客戶端(NetworkClient)
該類對象負責連接服務器,並與服務器通信(即受到服務器消息和發送消息給服務器)
Client方法
Connect:根據指定IP和Port連接服務器
RegisterHandler:注冊回調函數
Client屬性
網絡卵生對象(通過服務器在客戶端創建網絡游戲對象)
網絡中,所有的網絡對象都是由服務器產生
在客戶端玩家對象生成步驟:客戶端發請求,服務器接收請求后實例化客戶端對象
卵生對象生成步驟:
新建預制體,添加NetWorkidentity組件
客戶端調用ClientScene.Ready()方法告知服務器已經准備好
客戶端調用ClientScene.RegisterPrefab()注冊網絡預制體
客戶端調用ClientScene.AddPlayer()方法的回調告訴服務器產生對象
服務器RegisterHandler->MsgType.AddPlayer的回調Addplayer
服務器在AddPlayer方法實例化物體,調用Spawn方法卵生
Unity狀態同步
同步游戲物體的位置:NetworkTransform
NetworkBehaviour 組建是一個特殊的組件,它依賴NetworkIdentity組件,用來實現RPC技術和狀態同步屬性。我們想實現網絡物體的控制,必須繼承自NetworkBehaviour
RPC技術:
網絡系統可以實現客戶端和服務端的通信,我們將這種通信稱之為:遠程調用(Remote Procedure Calls),即RPC.RPC框架可以方便實現方法調用,使用戶不需要關心如何編碼連接和傳輸.
Unity中的RPC技術有兩種:
客戶端調用服務器方法(Command)
服務器調用客戶端方法(ClientRPC)
動畫同步
(1)首先這個玩家向服務器發起一個客戶端發起在服務端執行方法的命令,就是Command
(2)這個Command修飾方法體是由服務器調用一個由服務器發起,在各個客戶端執行方法的命令,即 ClientRpc修飾的方法
(3)在這個ClientRpc修飾的方法體中設置要進行同步的Trigger動畫的動畫設置
(4)要同步動畫的游戲對象身上要添加NetworkAnimator組件
(1)Command:客戶端調用,服務器執行,這樣客戶端調用的參數必需要UNet可以序列化,這樣服務器在執行時才能把參數反序列化。需要注意,在客戶端需要有權限的NetworkIdentity組件才能調用Command命令。
(2)ClientRpc:服務端調用,客戶端執行,同上,服務端的參數序列化到客戶端執行,一般來說,服務端會找到上面的NetworkIdentity組件,確定那些客戶端在監視這個NetworkIdentity,Rpc命令會發送給所有的監視客戶端。