unity官方內置網絡unet的實例教程(五)

我們接着上一章,繼續將角色的射擊行爲進行網絡化,爲了使射擊網絡化我們得更新 Bullet子彈預製體和腳本。

首先,打開Unity編輯器,找到Bullet子彈預製體,添加 NetworkIdentity 組件 和 NetworkTransform這樣使子彈預製具有ID識別和變換信息的傳輸。見下圖



添加組件並設置值爲0

接着,選中Hierarchy窗口中的 NetworkManager ,打開右側屬性面板的 Spawn Info,在 Registered Spawnable Prefabs的下面點擊加號,然後將子彈預製體拖進去。見下圖藍色位置。



添加子彈預製

接下來,更新 PlayerController 腳本的代碼,打開它進行編輯,最終的代碼如下(動手實踐是最好的學習方法,我把代碼做成難以複製,仔細看的模式,不知是否可取):



代碼

好了,保存腳本,回到Unity保存,重新再生成遊戲,進行測試,現在子彈可以同步啦,但是打到另外一個玩家,子彈被它的鐵布衫給反彈走了,好吧,接下來我們去掉這一逆天的武功。

注:

在這裏簡單借鑑下官方介紹[Command]的概念

[Command]屬性表示以下函數將被客戶端調用,將在服務端上運行。函數中的任何參數都將自動通過Command.Command傳遞給服務器,只能從本地玩家對象發送命令。在網絡遊戲中,會在服務端和所有的客戶端產生的遊戲對象,服務端有專門負責進行管理的底層腳本,當服務端的數據發生變化,就是傳輸給所有的客戶端,它們也隨着改變。當客戶端發送銷燬等指令的時候,服務端也執行這些特殊的方法,並將數據發送給所有的客戶端,即便是你剛進入遊戲,也能看到所有的變化。

爲了去掉玩家的鐵布衫,需要給玩家添加下生命值和相關的碰撞檢測,讓角色具有生死的概念,當然還是比人多了條復活的技能。

首先,我們在Scripts文件夾裏面新建一個腳本,重命名爲:Bullet,將它拖到Bullet預製屬性欄的下面。(或者可以在Bullet屬性欄直接添加腳本並重命名)



添加腳本

打開腳本,開始寫代碼:



好了保存腳本,回到Unity編輯器,保存,重新生成遊戲,進行測試,兩個玩家互相射擊,子彈碰撞到玩家身體的時候,子彈不再反彈而是消失了,然後可以看到在console控制檯裏面輸出了:


擊中目標

咦?怎麼子彈消失自動同步了呢?我們沒寫關於子彈消失的代碼怎麼就自動實現了呢?原來在上面我們把子彈交給NetworkManager管理,所以當客戶端調用了銷燬命令,服務器執行了銷燬,還發送給所有客戶端子彈銷燬。這些都是在底層代碼實現的,我們知道如何使用就夠了,如果想詳細瞭解請去官方查閱相關信息。

好吧,子彈是擊中了玩家,可是現在還沒的玩家沒有生命值,也看不到掉血或者死亡什麼的。先給玩家加個血條吧,一般的遊戲不都是這麼做的麼?老規矩,先製作單機版本。

新建C#腳本,重命名爲:Health,將它拖拽到Player屬性面板中,打開它,開始寫代碼:

設置玩家最大生命值爲100:public const int maxHealth = 100;

設置玩家當前生命值 默認等於最大生命值:public int currentHealth = maxHealth;

創建減少生命也就是造成傷害的方法:Take Damage()

最終的腳本如下:



接着更新子彈的腳本,調用剛纔的Health腳本中的Take Damage()方法:



這樣子彈就可以傷害玩家了,但是不能直接看出來,所以加一個簡單的血條吧。

右鍵,新建UI Image,這樣也創建一個新的 Canvas和一個 EventSystem 。將Canvas重命名爲:Healthbar Canvas,重命名Image爲 「Background」,將 Rect Transform 的 Width 改爲100 ,將Height10。



將 Image組件的 Source Image 設定爲 Input Field Background,將顏色設定爲紅色。



image


複製Background圖片,重命名爲:Foreground,首先在屬性面板進行重置:



把它作爲Background的子物體,像這樣:


選中Foreground,選中顏色爲綠色,將錨點設置爲。



將Playerprefab從項目窗口拖到Hierarchy中,選中Healthbar Canvas,修改Canvas’ Render Mode 爲World Space,拖拽Healthbar Canvas到 Player下面做爲它的子物體。



選中 Healthbar Canvas,重置 RectTransform爲默認值。



修改RectTransform’的縮放 Scale爲(0.01, 0.01, 0.01),位置Position爲(0.0, 1.5, 0.0),選中Player,在屬性面板 上方點apply



位置和縮放



點擊此按鈕接受保存

保存遊戲。爲了使血條反映角色的生命值變化 Health bar Canvas,需要修改Health腳本:



保存腳本,回到Unity,選中Player,在屬性面板中找到Health腳本,按下圖將Foreground拖入。



現在,讓血條始終面對玩家,不然角色轉身就變成了方塊了。

新建C#腳本,重命名爲:Billboard,拖拽它到Healthbar Canvason屬性面板內,打開腳本,寫下面的代碼:



保存腳本,回到Unity,選中Player預製,像以前一樣點擊屬性面板右上角的apply。然後刪除Player預製。保存Unity。像以前一樣,重新生成遊戲,然後進行聯網測試。可以發現:

目前,當玩家相互射擊時,Bullet和Health腳本在每個客戶端和服務器上都在「本地」工作,沒有發生同步,然而,子彈通過網絡管理器被管理爲生成對象,它們將被銷燬。血條也沒有變化。