【零基礎教學】Unet區域網聯機的實現——最基礎的Unity聯網實現方式(1)
第一部分——Lobby場景的搭建
-
學習前說明:
專案原始碼:連結:https://pan.baidu.com/s/1g78L9QODXdRjoVcm-odRSg 密碼:0pzo
原始碼引用自Siki老師的Unet基礎系列教程,文章主要以解釋為主,後期會新增一些Siki老師原始碼以外的新東西,敬請期待。
文中用紅色顯示的內容為我自己命名的關鍵名詞,例如場景名、程式碼名、闡述程式碼或方法所實現的功能 等等
本文中用藍色顯示的內容為UI元素、元件名或是變數名,例如Button、InputField、NetworkManager 等等
本文中僅討論Unet用於區域網的情況
如有網際網路聯網需求,請自行查詢Unity與Socket協議結合相關的文章,不推薦使用Unet完成
本文主要服務於渤海大學互動式虛擬現實開發基地,為求儘可能的細緻和易懂,可能有些地方寫的過於冗雜,不喜勿噴
-
流程簡述
- 建立Lobby場景
- 顯示IP文字
- 註冊到BuildSettings中——使場景能夠繫結至NetworkManager
- 建立NetworkManager——控制聯網
- 建立NetworkUI——繫結按鈕功能及功能實現
-
例項分析
- 首先,我們先簡單的搭個登入面板
1.新建一個場景,命名為 Lobby(大廳) ,在這個場景內,簡單的放上一些UI元素,其中有幾個部分必須要有。
- 當前IP
- 針對主機端,有一個開啟伺服器的按鈕(Button)
- 針對客戶端,有一個輸入IP地址的區域(InputField)
大概如圖所示
2.新建一個指令碼,掛在IP物體的Text上,用於獲得當前IP,以下為程式碼
using UnityEngine; using System; using System.Net; using System.Net.Sockets; using UnityEngine.UI; public class CurrentIP : MonoBehaviour { public static string GetLocalIP() { try { string HostName = Dns.GetHostName(); //得到主機名 IPHostEntry IpEntry = Dns.GetHostEntry(HostName); for (int i = 0; i < IpEntry.AddressList.Length; i++) { //從IP地址列表中篩選出IPv4型別的IP地址 //AddressFamily.InterNetwork表示此IP為IPv4, //AddressFamily.InterNetworkV6表示此地址為IPv6型別 if (IpEntry.AddressList[i].AddressFamily == AddressFamily.InterNetwork) { return IpEntry.AddressList[i].ToString(); } } return ""; } catch(Exception ex) { return ""; } } void Start() { //將IP在UI上顯示出來,我是掛在了Text元件本身上 GetComponent<Text>().text =string.Format("當前IP:<color=red>{0}</color>", GetLocalIP()); } }
3.建立一個新物體NetworkManager用於承載伺服器的連線功能,併為他掛上同名元件NetworkManager
4.將大廳場景(Lobby)與遊戲場景(Main)都註冊到BuildSettings中。
5.在NetworkManager中分別將兩個場景註冊到OfflineScene(大廳)和OnlineScene(遊戲介面)
在PlayerPrefab中,將預設生成的角色物體放入
Auto Create Player選項,用於判斷是否自動生成角色,預設為勾選狀態,也就是自動生成
在Registered Spawnable Prefabs中,將需要在各個客戶端中顯示的物體全部放入
6.新建一個遊戲物體NetworkUI,同時下掛一個同名新指令碼NetworkUI,用於繫結按鈕點選事件等操作,以下為程式碼
using UnityEngine;
using UnityEngine.Networking;
using UnityEngine.SceneManagement;
using UnityEngine.UI;
public class NetworkUI : MonoBehaviour
{
#region Variables
public Button hostButton;
public Button clientButton;
public InputField ipInput;
#endregion
void Awake()
{
CheckRegisted();
}
void Start()
{
print("start");
OfflineSet();
}
/// <summary>
/// 綁定當前按鈕事件
/// </summary>
public void OfflineSet()
{
hostButton.onClick.AddListener(StartHost);
clientButton.onClick.AddListener(StartClient);
print("OfflineSet");
}
/// <summary>
/// 檢查是否有空引用
/// </summary>
public void CheckRegisted()
{
if (hostButton == null)
{
hostButton = GameObject.Find("HostButton").GetComponent<Button>();
}
if (ipInput == null)
{
ipInput = GameObject.Find("IPInput").GetComponent<InputField>();
}
if (clientButton == null)
{
clientButton = GameObject.Find("ClientButton").GetComponent<Button>();
}
}
/// <summary>
/// HostButton繫結的事件
/// </summary>
public void StartHost()
{
print("StartHost");
NetworkManager.singleton.StartHost();
}
/// <summary>
/// ClientButton繫結的事件
/// </summary>
public void StartClient()
{
//先獲得當前主機的IP,我在InputField裡放了個預設值127.0.0.1,這是一個特殊IP,直接代表此計算機本身
NetworkManager.singleton.networkAddress = ipInput.text;
NetworkManager.singleton.StartClient();
}
}
執行效果
大功告成,接下來就可以進行進入遊戲場景了,具體UI的美化,可以根據實際需求進行更改,這裡只表示大廳功能最基礎的一部分。
就這樣吧,掰掰。