【零基础教学】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的美化,可以根据实际需求进行更改,这里只表示大厅功能最基础的一部分。


就这样吧,掰掰。

猜你喜欢

转载自blog.csdn.net/qq_35004993/article/details/82145835