Unity ping一个服务器 ip 的工具类

发表于2018-08-14
评论0 3.6k浏览
发现网络不好需要对服务器进行速度侦测,但又不想依赖服务器返回的时间戳,所以需要使用unity自带的ping类。

这里提供一个现成的工具类:
using UnityEngine;
using System.Collections;
public class UnityPing : MonoBehaviour
{
    private static string s_ip = "";
    private static System.Action<int> s_callback = null;
    private static UnityPing s_unityPing = null;
    private static int s_timeout = 2;
    public static void CreatePing(string ip, System.Action<int> callback)
    {
        if (string.IsNullOrEmpty(ip)) return;
        if (callback == null) return;
        if (s_unityPing != null) return;
        s_ip = ip;
        s_callback = callback;
        GameObject go = new GameObject("UnityPing");
        DontDestroyOnLoad(go);
        s_unityPing = go.AddComponent<UnityPing>();
    }
    /// <summary>
    /// 超时时间(单位秒)
    /// </summary>
    public static int Timeout
    {
        set
        {
            if (value > 0)
            {
                s_timeout = value;
            }
        }
        get { return s_timeout; }
    }
    private void Start()
    {
        switch (Application.internetReachability)
        {
            case NetworkReachability.ReachableViaCarrierDataNetwork: // 3G/4G
            case NetworkReachability.ReachableViaLocalAreaNetwork: // WIFI
                {
                    StopCoroutine(this.PingConnect());
                    StartCoroutine(this.PingConnect());
                }
                break;
            case NetworkReachability.NotReachable: // 网络不可用
            default:
                {
                    if (s_callback != null)
                    {
                        s_callback(-1);
                        Destroy(this.gameObject);
                    }
                }
                break;
        }
    }
    private void OnDestroy()
    {
        s_ip = "";
        s_timeout = 20;
        s_callback = null;
        if (s_unityPing != null)
        {
            s_unityPing = null;
        }
    }
    IEnumerator PingConnect()
    {
        // Ping网站
        Ping ping = new Ping(s_ip);
        int addTime = 0;
        int requestCount = s_timeout * 10; // 0.1秒 请求 1 次,所以请求次数是 n秒 x 10
        // 等待请求返回
        while (!ping.isDone)
        {
            yield return new WaitForSeconds(0.1f);
            // 链接失败
            if (addTime > requestCount)
            {
                addTime = 0;
                if (s_callback != null)
                {
                    s_callback(ping.time);
                    Destroy(this.gameObject);
                }
                yield break;
            }
            addTime++;
        }
        // 链接成功
        if (ping.isDone)
        {
            if (s_callback != null)
            {
                s_callback(ping.time);
                Destroy(this.gameObject);
            }
            yield return null;
        }
    }
}

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引