创建两个场景,自定义命名。如:第一个场景为Start,第二个场景为Main
使用UGUI在Start场景中创建按钮。
创建Player预制体,为此预制体添加Network Identity组件。并选择Local Player Authority。
在Start场景中创建空物体,重命名,如:Network
创建脚本
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Networking;
public class NetworkManagerCustom : NetworkManager
{
public static void LanGame()
{
singleton.StartCoroutine((singleton as NetworkManagerCustom).DiscoveryNetwork());//singleton单例
}
public IEnumerator DiscoveryNetwork()
{
NetworkDiscoveryCustom discovery = GetComponent<NetworkDiscoveryCustom>();//获取组件
discovery.Initialize();//组件初始化
discovery.StartAsClient();//作为客户端运行,扫描局域网的服务器,如果有就加入(自动调用NetworkDiscoveryCustom中的OnReceivedBroadcast)。
yield return new WaitForSeconds(2);//等待2秒
if (discovery.running)//2秒后仍未找到服务器…
{
discovery.StopBroadcast();//停止广播包
yield return new WaitForSeconds(0.5f);//等待0.5秒
discovery.StartAsServer();//作为服务器,发射广播包。
StartHost();//作为服务器和客户端同时启动
}
}
}
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脚本中的实例discovery.running为false
NetworkManagerCustom.singleton.networkAddress = fromAddress;//地址修改
NetworkManagerCustom.singleton.StartClient();//作为客户端打开
}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class IndexUI : MonoBehaviour
{
public void LanButtonClick()
{
NetworkManagerCustom.LanGame();
}
}
将IndexUI的LanButtonClick方法/函数绑定到按钮上。
将NetworkManagerCustom与NetworkDiscoveryCustom添加到Network上。
将NetworkManagerCustom组件的Online Scene设为Main场景。
将Player预制体添加到NetworkManagerCustom组件下的Player Prefab。
打包运行,打开至少两个程序。
一个作为服务器:
单击按钮后,场景由Start切换到Main。
Main场景中会自动生成一个Player物体。
其它的作为客户端。
单击按钮后,Main场景中会再次自动生成一个Player物体。