如何在Unity 2018+中获取设备的IP地址?

Ork*_*kan 0 c# ip ip-address unity-game-engine

如何在Unity 2018.2+中为Android设备开发的程序中获取C#的IP地址?

似乎Network.player.ipAddress现在已经弃用了,所以我正在寻找一种新的方式.

Pro*_*mer 9

Network.player.ipAddress由于它基于旧的过时的Unity网络系统,因此已被弃用.

如果您使用的是Unity的新uNet网络系统,则可以使用NetworkManager.networkAddress;

string IP = NetworkManager.singleton.networkAddress;
Run Code Online (Sandbox Code Playgroud)

如果您使用的是原始网络协议和TCP/UDP等API,则必须使用NetworkInterfaceAPI来查找IP地址.IPManager我在台式机和移动设备上使用哪种方式对我有用:

IPv4:

string ipv4 = IPManager.GetIP(ADDRESSFAM.IPv4);
Run Code Online (Sandbox Code Playgroud)

IPv6:

string ipv6 = IPManager.GetIP(ADDRESSFAM.IPv6);
Run Code Online (Sandbox Code Playgroud)

IPManager类:

using System.Net;
using System.Net.NetworkInformation;
using System.Net.Sockets;

public class IPManager
{
    public static string GetIP(ADDRESSFAM Addfam)
    {
        //Return null if ADDRESSFAM is Ipv6 but Os does not support it
        if (Addfam == ADDRESSFAM.IPv6 && !Socket.OSSupportsIPv6)
        {
            return null;
        }

        string output = "";

        foreach (NetworkInterface item in NetworkInterface.GetAllNetworkInterfaces())
        {
#if UNITY_EDITOR_WIN || UNITY_STANDALONE_WIN
            NetworkInterfaceType _type1 = NetworkInterfaceType.Wireless80211;
            NetworkInterfaceType _type2 = NetworkInterfaceType.Ethernet;

            if ((item.NetworkInterfaceType == _type1 || item.NetworkInterfaceType == _type2) && item.OperationalStatus == OperationalStatus.Up)
#endif 
            {
                foreach (UnicastIPAddressInformation ip in item.GetIPProperties().UnicastAddresses)
                {
                    //IPv4
                    if (Addfam == ADDRESSFAM.IPv4)
                    {
                        if (ip.Address.AddressFamily == AddressFamily.InterNetwork)
                        {
                            output = ip.Address.ToString();
                        }
                    }

                    //IPv6
                    else if (Addfam == ADDRESSFAM.IPv6)
                    {
                        if (ip.Address.AddressFamily == AddressFamily.InterNetworkV6)
                        {
                            output = ip.Address.ToString();
                        }
                    }
                }
            }
        }
        return output;
    }
}

public enum ADDRESSFAM
{
    IPv4, IPv6
}
Run Code Online (Sandbox Code Playgroud)