第一部分——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的美化,可以根据实际需求进行更改,这里只表示大厅功能最基础的一部分。
就这样吧,掰掰。