一、创建房间2D转3D

因为默认的HUD是OnGUI代码绘制的。在VR眼镜里是碰不到的,且我是用手套交互不是用手柄交互的。我放了两个button 和一个 text框 以及 自己弄了一个小键盘用于输入IP (调不起来Focus原生键盘。鼓捣一天真的调用不起来,AI也帮不了我,就很难TAT,我是真心想调)
替换了HUD代码,新写了一页:

using UnityEngine;
using Mirror;
using UnityEngine.UI;
using GameScript.Runtime.FrameWork.Manager;
public class NetworkUIController : MonoBehaviour
{
// 在 Inspector 中拖拽场景中的 NetworkManager 实例
public NetworkManager networkManager;
public Text IPText;
private void Awake()
{
// 如果未指定,自动查找场景中的 NetworkManager
if (networkManager == null)
networkManager = NetworkManager.singleton;
}
// 供 Button 绑定的“启动主机”方法
public void OnStartHostClicked()
{
if (networkManager == null)
{
Debug.LogError("NetworkManager 未赋值!");
return;
}
// 前置检查:如果已在网络中,则先关闭
if (networkManager.isNetworkActive)
{
networkManager.StopHost();
}
// 调用 NetworkManager 的 StartHost()
networkManager.StartHost();
Debug.Log("主机启动成功!");
}
// 可选:添加“启动服务器”“启动客户端”“停止网络”等方法
public void OnStartServerClicked()
{
if (networkManager != null && !networkManager.isNetworkActive)
networkManager.StartServer();
}
public void OnStartClientClicked()
{
if (networkManager == null) return;
// 停止现有网络连接
if (networkManager.isNetworkActive)
{
networkManager.StopHost();
}
// 使用输入框文本作为IP地址
if (!string.IsNullOrWhiteSpace(IPText.text))
{
networkManager.networkAddress = IPText.text;
}
else // 输入为空时使用默认地址
{
networkManager.networkAddress = "localhost";
Debug.LogWarning("输入为空,使用默认地址: localhost");
}
networkManager.StartClient();
Debug.Log($"正在连接至主机: {networkManager.networkAddress}");
}
public void OnStopNetworkClicked()
{
if (networkManager != null && networkManager.isNetworkActive)
networkManager.StopHost();
}
}
二、获取本机IP
1.这个不行
/// <summary>
/// 获取本机IP
/// </summary>
/// <returns></returns>
/// <exception cref="System.Exception"></exception>
public static string GetLocalIPAdress()
{
var host = Dns.GetHostEntry(Dns.GetHostName());
foreach (var ip in host.AddressList)
{
if (ip.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork)
{
return ip.ToString();
}
}
throw new System.Exception("没有找到本机IPv4地址");
}
用这个获取,电脑上的IP是正常的,但是Focus 我两个头盔同时打开的时候获取的是同样的IP(就离谱)
2.然后采取了一个比较歹的方法获取IP就对了。
/// <summary>
/// 获取本机IP
/// </summary>
/// <returns></returns>
/// <exception cref="System.Exception"></exception>e
public static string GetLocalIPAdress()
{
try
{
// 连接到一个外部服务器来确定用于互联网的IP
using (Socket socket = new Socket(AddressFamily.InterNetwork,
SocketType.Dgram, 0))
{
// 不需要实际连接,只是为了获取用于连接外部的IP
socket.Connect("8.8.8.8", 65530);
IPEndPoint endPoint = socket.LocalEndPoint as IPEndPoint;
if (endPoint != null)
{
return endPoint.Address.ToString();
}
else
{
return endPoint.Address.ToString();
}
}
}
catch (System.Exception ex)
{
Debug.LogError("获取IP失败: " + ex.Message);
return "";
}
}
1万+

被折叠的 条评论
为什么被折叠?



