[ UNet ] 基礎教學 #01 – 前置作業

標籤: , , , ,

—Unity 多人連線 UNet 教學 #01—

為了教學上的方便,在UNet系列教學文中會使用2D專案做展示,會以讓大家「快速入門」為主要目標
在開始寫Code之前,我們必須先了解Unity官方提供了哪些API與組件供我們使用,大略的說明請看官方文件檔

 

首先建立一個2D空專案,在場景中加入空物件(CameObject -> Create Empty),命名為「NetManager
替「NetManager」添加組件「Network -> NetworkManager」 與 「Network -> NetworkManagerHUD
並將目前場景儲存為「Lobby

NetworkManager組件是管理多人連線的主要組件,在接下來多人連線處裡都必須透過他,也因此場景中只會有唯一一個NetworkManager
接下來對他的屬性做簡單的介紹

  • Dont Destroy On Load – 是否在切換場景時不刪除物件,預設為True,除非有特殊用途不然不建議設為False
  • Run in Background – 是否在背景執行,若運行在行動裝置上會不建議開啟背景執行,因為要顧慮到效能與流量
  • Log Level
  • Offline Sence – 在未建立連線(或失去連線)時的場景
  • Online Scene – 在連線建立後的場景
  • Network Info – 網路連線資訊 在這邊我們挑重點講
    • Network Address – 連線的IP地址,預設是「localhost」也就是本機的意思
    • Network Part – 連線埠,這是用來代表應用程式的對外接口,每個有網路功能的應用程式都會設定一個Port,而此Port不能跟其他程式有衝突
  • Spawn Info – 卵資訊,這部分是關於需進行連線處裡的物件
    • Player Prefab – 玩家物件,每個玩家在加入遊戲時會建立「唯一的」Player Prefab,可以做為每個玩家的單一識別
    • Auto Create Player – 是否自動建立玩家物件,預設是True
    • Registered Spawnable Prefabs – 註冊卵物件列表,所有需要連線處裡的物件都必須加入到卵列表之中
  • Advanced Configuration – 高級設置,還不用這麼高級,先不管他

 

NetworkManagerHUD組件是NetworkManagerHUD的預設UI,說實話長得不怎麼樣,但是對於測試而言十分足夠

而他的屬性沒有什麼特別的,「showGUI」為是否顯示預設UI,其他屬性是UI位置的偏移量。

 

接下來建立一個新物件命名為「PlayerActor」代表玩家,添加「Netowrk Identity」組件勾選Local Player Authority並將其建立成Prefab,留在場景的「PlayerActor」就可以刪除了

Netowrk Identity」可以想像成物件的身分證,用於在網路傳遞時作為唯一的識別項,Local Player Authority屬性表示此物件可以讓Clinet端的玩家擁有控制權

 

建立一個新場景並命名為「Game」,為了做出一點區別我添加了半透明的背景,順便加入一些簡單的素材作為待會要用的東西,大家可以自行添加一些圖來方便練習。

再來替「PlayerActor」增加一點造型,這邊大家可以自由發揮,記得不要將物件留在場景上

 

新增一個C#腳本命名為「Move」,撰寫簡單的移動功能

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

using UnityEngine.Networking;

public class Move : NetworkBehaviour {
  public float speed = 3;
  // Use this for initialization
  void Start () {
    
  }
  
  // Update is called once per frame
  void Update () {
    if (hasAuthority)
    {
      float x = Input.GetAxis("Horizontal");
      float y = Input.GetAxis("Vertical");
      
      transform.Translate(new Vector2(x,y) * Time.deltaTime * speed);
    }
    
  }
}

※有基礎人看到這應該會覺得怪怪的,但這些怪怪的點留在接下來的篇章在做解釋,大家可以試著用平常的寫法看看待會會怎麼樣

將「Move」腳本添加給「PlayerActor」,再添加「NetworkTransform」組件

NetworkTransform」的功能是自動同步位置,在多人連線中若不進行「同步」兩邊的畫面是不會一致的

此時我們準備了以下幾個東西

  • Lobby場景 並包含NetManager
  • Game場景
  • PlayerActor

這些準備完畢後就達成了多人連線的條件

先在發佈設定中將「Lobby」「Game」加入建構列表中

回到「Lobby」場景,把「Lobby」加入到「NetManager」的Offline Scene,將「Game」設定至Online Scene,再將「PlayerActor」設定至Player Prefab

最後儲存場景,將遊戲發佈成PC的exe執行檔,開啟「兩個」遊戲

沒意外的話畫面會長成這個樣子,這時左邊的遊戲按下LAN Host,右邊的遊戲按下LAN Client

兩邊遊戲各自按下鍵盤上下左右試一試,能夠各自操控自己的角色就表示連線成功了!

最基本的多人連線功能這樣就完成了,如果再多開幾個遊戲按下LAN Client也能夠加入到這遊戲中

不過會注意到移動明顯的很卡,這部分就留到接下來的篇章做說明

 

感謝大家的閱讀!後續文章將開始講解 Sync 資料同步RPC遠端呼叫以及ServerClient與各自權重的關係

 

[ UNet ] 基礎教學 #02 – NetworkBehaviour

 



相關文章

教學 #14 – Scene(場景) Scene是個很重要的環節,在中文稱為「場景」 以比較直覺的方式來說明的話,Scene可以當作遊戲中的關卡,每一個關卡都是獨立的Scene 在Unity的工具列中,File下會看到...
教學 #12 – Layer(層級) 另一個與Tag很像的東西叫做Layer,是層級、階層的意思,在Unity中與Tag有同樣的功能,但是Layer會牽扯到碰撞判定。 Layer的設定方式與Tag一致,位置就在Tag的右邊而已 ...
教學 #01 – 物件建立與Hello World! 上一篇文章中提到安裝與版面配置,這一篇文章中我們來撰寫第一行程式碼 目前我們的畫面應該是長這樣的 Hierarchy中有一個Main Camera 在上一篇文章中我們有提...
基礎教學 #06 – Spawn 卵生 在UNet中若要用程式碼生成物件,必須先和平常一樣用Instantiate生成物件,在透過「NetworkServer.Spawn」這個功能卵生到Client端。 也就是將一個存在於Se...