Unity 之 Ping类简析&尝试使用

Ping 什么意思???

【来自百度百科的诠释:】 Ping是Windows、Unix和Linux系统下的一个命令。ping也属于一个通信协议,是TCP/IP协议的一部分。利用“ping”命令可以检查网络是否连通,可以很好地帮助我们分析和判定网络故障。应用格式:ping空格IP地址。该命令还可以加许多参数使用,具体是键入ping按回车即可看到详细说明。

Unity Ping:

ping操作是异步的,可以使用ping.isDone对ping对象进行状态轮询。当收到答复时,它在ping.time。 注意:在WindowsStore应用程序上,流套接字用于模拟ping功能,它将尝试打开与端口80的指定IP地址的连接。此外,您还需要在Package.appx清单中启用InternetClient功能。
官方文档:https://docs.unity3d.com/2017.2/Documentation/ScriptReference/Ping.html

文档上,只体现了三个属性和一个方法,,,程序集源码如下:
#region 程序集 UnityEngine, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
// E:\program files\Unity\Editor\Data\Managed\UnityEngine.dll
#endregion

using UnityEngine.Scripting;

namespace UnityEngine
{
    //
    // 摘要:
    //     Ping any given IP address (given in dot notation).
    //Ping任何给定的IP地址(用点符号表示)。
    public sealed class Ping
    {
        //
        // 摘要:
        //     Perform a ping to the supplied target IP address.
        //     对提供的目标IP地址执行ping。
        // 参数:
        //   address: ip地址
        [GeneratedByOldBindingsGeneratorAttribute]
        public Ping(string address);

        ~Ping();

        //
        // 摘要:
        //     Has the ping function completed?
        //     ping功能完成了吗?
        public bool isDone { get; }
        //
        // 摘要:
        //     This property contains the ping time result after isDone returns true.
        //     此属性包含isDone返回true后的ping时间结果。
        public int time { get; }
        //
        // 摘要:
        //     The IP target of the ping.
        //     ping的IP目标。
        public string ip { get; }

        [GeneratedByOldBindingsGeneratorAttribute]
        [ThreadAndSerializationSafeAttribute]
        public void DestroyPing();
    }
}

尝试写了一下,发现并不好用,代码如下:【期待大佬留言纠错,指点】
using System.Collections;
using System.Collections.Generic;
using System.Reflection.Emit;
using UnityEngine;

public class UnityPing : MonoBehaviour
{
    void Start()
    {
        StartCoroutine(CheckPing());
    }

    IEnumerator CheckPing()
    {
        //Ping服务器 
        Ping ping = new Ping("服务器IP");

        int time = 0;

        Debug.Log("开始尝试连接... : " + ping.isDone);
        while (!ping.isDone)
        {
            yield return new WaitForSeconds(0.1f);
            if (nTime > 20) //2秒
            {
                Debug.Log("连接失败 ... " + ping.time);
                yield break;
            }
            time ++;
        }
        if (ping.isDone)
        {
            yield return ping.time;
            Debug.Log("连接成功... 就没成功过");
        }
    }
 }


文末分享一个Unity ping一个服务器 ip 的工具类 ,原文链接:https://gameinstitute.qq.com/community/detail/126598

ps:原文的大括号是中文字符,如有使用建议直接复制下文代码。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

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;
        }
    }
}

FPS 工具类分享

using System.Text;
using UnityEngine;
using UnityEngine.Profiling;

public class FPS : MonoBehaviour
{
	private float w;

	private float h;

	private Rect rect;

	private string sUserMemory;

	private string s;

	public bool OnMemoryGUI;

	private long MonoUsedM;

	private long AllMemory;

	[Range(0f, 100f)]
	public int MaxMonoUsedM = 50;

	[Range(0f, 400f)]
	public int MaxAllMemory = 200;

	public long GfxDriver;

	public long ReservedMemory;

	private StringBuilder sb = new StringBuilder();

	private float updateInterval = 0.5f;

	private float accum;

	private float frames;

	private float timeleft;

	private float fps;

	private string FPSAAA;

	[Range(0f, 150f)]
	public int MaxFPS;

	private GUIStyle style = new GUIStyle();

	private void Start()
	{
		timeleft = updateInterval;
		style.fontSize = 20;
		h = (float)Screen.height / 720f;
		w = (float)Screen.width / 1280f;
		style.fontSize = (int)(30f * w);
		GUI.color = new Color(1f, 0f, 0f);
		rect = new Rect(10f, 70f, 200f * w, 60f * h);
	}

	private void Update()
	{
		UpdateUsed();
		UpdateFPS();
	}

	private void UpdateUsed()
	{
		sb.Clear();
		MonoUsedM = Profiler.GetMonoUsedSizeLong() / 1000000;
		ReservedMemory = Profiler.GetTotalReservedMemoryLong() / 1000000;
		AllMemory = Profiler.GetTotalAllocatedMemoryLong() / 1000000;
		GfxDriver = Profiler.GetAllocatedMemoryForGraphicsDriver() / 1000000;
		sb.Append("MonoUsed:" + MonoUsedM + "M\n");
		sb.Append("GfxDriver:" + GfxDriver + "M\n");
		sb.Append("AllMemory:" + AllMemory + "M\n");
		sb.Append("ReservedMemory:" + ReservedMemory + "M\n");
		sb.Append("UnUsedReserved:" + Profiler.GetTotalUnusedReservedMemoryLong() / 1000000 + "M\n");
		sb.Append("FPS:" + FPSAAA + "\n");
	}

	private void UpdateFPS()
	{
		timeleft -= Time.deltaTime;
		accum += Time.timeScale / Time.deltaTime;
		frames += 1f;
		if ((double)timeleft <= 0.0)
		{
			fps = accum / frames;
			FPSAAA = fps.ToString("f2");
			timeleft = updateInterval;
			accum = 0f;
			frames = 0f;
		}
	}

	private void OnGUI()
	{
		if (OnMemoryGUI)
		{
			GUI.Label(rect, sb.ToString(), style);
		}
	}
}
  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陈言必行

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值