Mirror 制作Day1笔记 Focus+Hi5 2

一、创建房间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 "";
        }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值