Unity3d學習記錄之UNet網路模組
學習來源:
聯機遊戲可增加遊戲的可玩性和競技性,所以一款好的聯機遊戲將會帶來很多樂趣。
Unity自帶一個簡單的網路模組UNet,可將單人遊戲改成多人聯機遊戲。
將單人遊戲轉換為Unity多人遊戲的步驟:
①:給遊戲增加網路管理NetworkManager和NetworkManagerHUD
NetworkManager用於管理整個網路遊戲,NetworkManagerHUD是為了簡單測試聯機遊戲,而後的網路連線端UI可自行編寫。
Show Runtime GUI :
顯示執行時GUI | 勾選此複選框可在執行時顯示網路管理器HUD GUI。這允許您顯示或隱藏它以便快速除錯。 |
②在玩家預製體身上新增NetworkIdentity元件(網路標誌),用於是在服務端控制還是客戶端(本地)控制。網路遊戲物體必須攜帶!
新增NetworkTransform元件,同步其物理性質。在操作玩家時的指令碼需將繼承類改成NetworkBehavior,使用網路模組的類。為了區分玩家操控,需用IslocalPlayer來對程式碼進行判斷,因為在網路遊戲中所獲得到的除自己以外的物體,全部都是通過服務端進行同步,所以當使用了IslocalPlayer判斷是否為本地客戶端的玩家操作,就可以進行本地操控,而不是同時操控全部玩家。
Server Only:
僅限伺服器 |
勾選此複選框以確保Unity僅生成伺服器上的GameObject,而不是客戶端上的GameObject。 |
Local Player Authority:
本地球員管理局 | 勾選此複選框可將此GameObject的權威網路控制權提供給擁有它的客戶端。該客戶端上的玩家GameObject擁有對它的許可權。其他元件(如Network Transform)使用此選項來確定將哪個客戶端視為許可權來源。 |
③處理非玩家物體
物體本身需要新增NetworkIdentity和NetworkTransform元件,且需要在NetworkManager下進行註冊。
玩家預製體則在Player Prefab上註冊,而剩餘的生成物體則需要在Registered Spawnable Prefabs中註冊。
修改spawner僅在伺服器上執行(使用isServer屬性或OnStartServer()
函式)且用NetworkServer.Spawn()進行同步建立的物體。
is Server屬性可將某函式僅在伺服器中呼叫,OnStartServer()函式是在服務端開始時呼叫(Awake)。
④玩家的出生位置處理
需要新增NetworkStartPosition元件用於生成玩家位置。
⑤房間系統(進入遊戲介面之前的場景)
建立空物體並在上面新增Network Lobby Manager元件
Lobby Scene:用於顯示房間的場景(遊戲介面場景)
Play Scene:遊戲場景
Lobby Player Prefab:進入房間場景中的玩家預製體(需要新增Network Lobby Player元件)
Game Player Prefab :進入遊戲的的玩家預製體
自此,一個簡單的多人遊戲網路框架大概就知道了。但如何從客戶端與服務端進行互動,這才是網路遊戲的重點也是難點。
可在指令碼中新增[Commad]屬性,將某函式(需以Cmd開頭)變成從客戶端呼叫,從服務端執行。
[ClientRpc]屬性,將某函式(需以Rpc開頭)變成從服務端呼叫,從客戶端執行。
[SyncVar]屬性,在當前幀結束前傳送給客戶端,同步各機理。