【问题标题】:How do I get a device's gateway in Unity?如何在 Unity 中获取设备的网关?
【发布时间】:2016-02-24 05:15:47
【问题描述】:

我正在尝试在 Android 智能手机上以 Unity 和 C# 接收设备的标准网关,但我无法修复它。

这就是我问是否有可能在使用 Unity 和 C# 的 Android 智能手机上找到网关的原因。

我已经尝试过这个,它可以在 Unity 编辑器中使用:

    NetworkInterface[] adapters = NetworkInterface.GetAllNetworkInterfaces();
    foreach (NetworkInterface adapter in adapters)
    {
        IPInterfaceProperties adapterProperties = adapter.GetIPProperties();
        GatewayIPAddressInformationCollection addresses = adapterProperties.GatewayAddresses;
        if (addresses.Count > 0)
        {
            foreach (GatewayIPAddressInformation address in addresses)
            {
                if (address.Address.ToString() != "0.0.0.0")
                {
                    Debug.Log("Gateway: " + address.Address.ToString());
                }
            }
        }
    }

【问题讨论】:

  • 此解决方案存在一个问题。在 Android 中找不到 DLL,如果我想将 DLL 文件添加为引用,则 Microsoft 表示无法添加该引用,因为它可能无法访问或者是有效的程序集/COM 组件。 (所以它只适用于我的桌面)
  • 我确实在 adb logcat 中收到此错误。也许这会对你有所帮助? I/Unity (14783): EntryPointNotFoundException: getifaddrs I/Unity (14783): at (wrapper managed-to-native) System.Net.NetworkInformation.LinuxNetworkInterface:getifaddrs (intptr&)
  • Entry Point not found 意味着名称错误或方法/函数不是公共的(也是静态的和/或外部的)。检查函数名 getifaddrs 以确保它正确,包括大小写值。

标签: c# android unity3d gateway


【解决方案1】:

Assets/Plugins/Android 目录上创建一个Network.java 文件。

资产/插件/Android/Network.java

package com.mynet;
 
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.SocketException;
import java.util.Enumeration;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
 
 
public class Network{
    //Match the IP of class C address
    public static final String regexCIp = "^192\\.168\\.(\\d{1}|[1-9]\\d|1\\d{2}|2[0-4]\\d|25\\d)\\.(\\d{1}|[1-9]\\d|1\\d{2}|2[0-4]\\d|25\\d)$";
    //Match a class A address
    public static final String regexAIp = "^10\\.(\\d{1}|[1-9]\\d|1\\d{2}|2[0-4]\\d|25\\d)\\.(\\d{1}|[1-9]\\d|1\\d{2}|2[0-4]\\d|25\\d)\\.(\\d{1}|[1-9]\\d|1\\d{2}|2[0-4]\\d|25\\d)$";
    //Match B address
    public static final String regexBIp = "^172\\.(1[6-9]|2\\d|3[0-1])\\.(\\d{1}|[1-9]\\d|1\\d{2}|2[0-4]\\d|25\\d)\\.(\\d{1}|[1-9]\\d|1\\d{2}|2[0-4]\\d|25\\d)$";
 
 
    public  String getHostIp() {
        String hostIp;
        Pattern ip = Pattern.compile("(" + regexAIp + ")|" + "(" + regexBIp + ")|" + "(" + regexCIp + ")");
        Enumeration<NetworkInterface> networkInterfaces = null;
        try {
            networkInterfaces = NetworkInterface.getNetworkInterfaces();
        } catch (SocketException e) {
            e.printStackTrace();
        }
        InetAddress address;
        while (networkInterfaces.hasMoreElements()) {
            NetworkInterface networkInterface = networkInterfaces.nextElement();
            Enumeration<InetAddress> inetAddresses = networkInterface.getInetAddresses();
            while (inetAddresses.hasMoreElements()) {
                address = inetAddresses.nextElement();
                String hostAddress = address.getHostAddress();
                Matcher matcher = ip.matcher(hostAddress);
                if (matcher.matches()) {
                    hostIp = hostAddress;
                    return hostIp;
                }
 
            }
        }
        return null;
    }
}

C# 代码中使用此脚本,如下所示:

using UnityEngine;
using UnityEngine.UI;

public class MyIPScript: MonoBehaviour
{

    public Text ipText;

    public void Start()
    {
        string ip = GetIP();
        ipText.text = ip;
    }

    private string GetIP() {
        AndroidJavaObject jo = new AndroidJavaObject("com.mynet.Network");
        AndroidJavaClass act = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
        return jo.Call<string>("getHostIp");
    }
}

注意:这仅适用于Android 设备。如果您在PC 上测试它,您将看不到任何 IP 地址。因此,通过从Build Settings 中选择Android 来构建您的统一项目并生成apk 文件,然后将其安装在您的Android PhoneVR Headset 上。我在Oculus Quest 上对其进行了测试,效果很好。

【讨论】:

    猜你喜欢
    • 2021-05-21
    • 1970-01-01
    • 2019-01-29
    • 1970-01-01
    • 2023-03-31
    • 2016-10-23
    • 2015-02-11
    • 2014-06-08
    • 2015-02-26
    相关资源
    最近更新 更多