大家刚学Unet的时候应该都会接触到Network Manager HUD这个组件:

这是Unet默认的UI,允许你选择 成为主机 或者 成为客户端加入主机。但是如果你这个游戏想做得认真一点,那么用这个默认的UI显然不太合适,显得很简陋。
其实Unity也提供了相关的API,来让你用代码实现用Network Manager HUD可以做到的所有事情
首先第一步你需要新建一个空物体,然后给这个空物体改名为Unet,并给Unet加上两个脚本:NetworkManagerCustom,NetworkDiscoveryCustom。在Unity里面,一个脚本实际上就是一个类。这两个类(或者说是脚本)分别继承自NetworkManager和NetworkDiscovery。这样方便我们使用两个父类的一些方法和属性来实现我们的功能。

别忘了把Offline Scene和Online Scene配置好,这样当创建主机或者加入主机的时候才可以切换到相应的场景(不过不知道可不可以让Online Scene不止一个,过几天我查一下官方文档)
NetworkManagerCustom的代码如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Networking;
public class NetworkManagerCustom : NetworkManager
{
NetworkDiscoveryCustom discovery;
void Start()
{
discovery = GetComponent<NetworkDiscoveryCustom>();
StartCoroutine(DiscoverNetwork());
}
public IEnumerator DiscoverNetwork()
{
//监听其它的服务器
discovery.Initialize();
discovery.StartAsClient();
//等待2秒,等监听结果
yield return new WaitForSeconds(2f);
//没有找到局域网服务器就建立服务器
if (discovery.running)
{
discovery.StopBroadcast();
discovery.StartAsServer();
StartHost();
}
}
}
NetworkDiscoveryCustom的代码如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Networking;
public class NetworkDiscoveryCustom : NetworkDiscovery
{
public override void OnReceivedBroadcast(string fromAddress, string data)
{
StopBroadcast();
NetworkManagerCustom.singleton.networkAddress = fromAddress; //注意singleton不能省略,原因我也不知道 = =
NetworkManagerCustom.singleton.StartClient();
}
}
参考资料:
Unet局域网框架 以及 官方文档关于NetworkDiscovery和NetworkManager的说明
如果你们看上面的代码发现有不熟悉的方法,可以去官方文档看下相应的API,或者留言