1. 程式人生 > >【零基礎教學】Unet區域網聯機的實現——最基礎的Unity聯網實現方式(1)

【零基礎教學】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)
    ,和一個加入伺服器的按鈕(Button)

  大概如圖所示

  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的美化,可以根據實際需求進行更改,這裡只表示大廳功能最基礎的一部分。

就這樣吧,掰掰。