JavaScript中的定时器与延时器,分别是 setInterval、setTimeout,对应的清理函数是:clearInterval、clearTimeout。

而在Unity中,则分别是:Invoke、InvokeRepeating和取消延迟调用  CancelInvoke

延迟调用

void Invoke(string methodName, float time);

重复延迟调用

void InvokeRepeating(string methodName, float time, float repeatRate);

在 time 后调用 methodName 方法然后每 repeatRate 秒 重复调用。

上面二个方法有什么用处呢?我想到的应用场景就是,在游戏主界面显示当前游戏的延迟 —— 几乎成为游戏的标配了。

为了设计不至于太过复杂,我直接采用了定时器不断的Ping,每隔几秒就Ping一次,并给定每一次 Ping 一个超时上限。

using System.Collections;
using System.Collections.Generic;
using UnityEngine; public class PingTool : MonoBehaviour
{
// 最大尝试ping的次数
private static int nMaxTryNum = 10; // 检测频率
private static float nCheckInterval = 3f; // 需要 ping 的 IP
private static string strRemoteIP = ""; private static PingTool pingTool; public static void CreatePing(string strIP)
{
if (string.IsNullOrEmpty(strIP)) return; if (pingTool != null)
{
Debug.Log("Please Stop Ping Before.");
return;
} strRemoteIP = strIP; // 复用组件,避免频繁的创建和销毁组件
GameObject go = GameObject.Find("PingTool");
if (go == null)
{
go = new GameObject("PingTool");
DontDestroyOnLoad(go);
} pingTool = go.AddComponent<PingTool>();
} public static void StopPing()
{
if (pingTool != null)
{
pingTool.CancelInvoke();
Destroy(pingTool);
}
} public static void SetCheckInterval(float value)
{
nCheckInterval = value;
} private void Start()
{
InvokeRepeating("Execute", 0, nCheckInterval);
} private void Execute()
{
if (pingTool == null) return; StartCoroutine(PingConnect());
} private void Destroy()
{
strRemoteIP = "";
nCheckInterval = 1.0f; pingTool = null;
} private IEnumerator PingConnect()
{
if (pingTool != null)
{
Ping ping = new Ping(strRemoteIP); int nTryNum = 0;
while (!ping.isDone)
{
yield return new WaitForSeconds(0.2f); // Ping Fail
if (nTryNum++ > nMaxTryNum)
{
yield break;
}
} if (ping.isDone)
{
int nDelayTime = ping.time; Debug.Log("nDelayTime : " + nDelayTime.ToString() + "\t" + Time.time);
}
else
{
// 延时超过 2000 毫秒 }
}
}
}

上面的例子每0.2秒检测一次 Ping 是否结束,最多十次检测,也就是2秒超时的时长。每3秒再检测一次,上面示例代码可以再添加一个 callback

Unity中的定时器与延时器的更多相关文章

  1. 关于Unity中的刚体和碰撞器的相关用法(二)

    在关于Unity中的刚体和碰撞器的相关用法(一)的基础上 有一个plane平面,一个ball球体,都挂了碰撞器,ball挂了刚体Rigidbody,写了一个脚本ball挂载在球体上,球体从空中落下装机 ...

  2. 关于Unity中的刚体和碰撞器的相关用法(一)

    1.创建一个3D工程 2.构造项目文件目录 3.保存场景为game_scene到文件夹scenes中 4.创建一个Plane平面类型的GameObject节点和一个Sphere球体类型的GameObj ...

  3. 关于Unity中的定时器和委托

    一.Invoke定时器 有3种定时器,这里我们讲Invoke 1.创建一个Canvas 2.对Canvas进行初始化 3.创建一个Image的UI节点作为Canvas的子节点,名字叫bg,拖进背景图片 ...

  4. 关于Unity中的Mesh Collider碰撞器

    原来我的场景中有一个平面Plane带Mesh Collider碰撞器组件,一个主角Hero带有一个Box Collider碰撞器和有重力的Rigidbody刚体组件,主角可以放在平面上. 在导入场景后 ...

  5. 2.linux系统基础笔记(延时操作、实时系统中的定时器、事件)

    延时操作 延时操作是操作系统中经常遇到的一种情形.延时的原因很多,有的时候是为了等待外设芯片处理结束,有的时候是为了暂时释放cpu的使用权,有的就是为了希望在一段时间获取资源,如果没法在单位时间内获取 ...

  6. Android中几种常用的定时器和延时方法

    通过实际项目的练习,掌握了几种android基本定时器和延时的用法,这里我想总结一下作为自己的收获,下面列出的是比较简洁的模式,方便简单地在程序中直接调用. 一.三种常用的定时器 1.Handler类 ...

  7. JS 定时器/延时器

    定时器 创建定时器    window.setInterval(方法类型,间隔时间(1000=1秒)) var timer=window.setInterval(func,2000); var i=0 ...

  8. unity中使用的着色器语言

    在unity中,着色器编程使用了一列列的HLSL语言变种(也叫作Cg,但是大部分实际上两者都是一样的). 目前,为了在不同平台下保持最好的跨平台性, 取样贴图时,最好使用DX9风格 的HLSL. 着色 ...

  9. 【原创翻译】初识Unity中的Compute Shader

    一直以来都想试着自己翻译一些东西,现在发现翻译真的很不容易,如果你直接把作者的原文按照英文的思维翻译过来,你会发现中国人读起来很是别扭,但是如果你想完全利用中国人的语言方式来翻译,又怕自己理解的不到位 ...

随机推荐

  1. Python的_文件操作

    打开文件:file_obj=open("文件路径","模式",“编码”’) 其中模式有: r,以只读方式打开文件(默认) w,打开一个文件只用于写入(不存在则创 ...

  2. day 68 django 之api操作 | jQueryset集合与对象

    我们的orm里面分为: jQueryset集合, 还有对象, 我们的jqueryset集合里面可以有多个对象,这句话的意思就是我们的对象是最小的单位,不可以再拆分了,我们的jQueryset集合就相当 ...

  3. HDU 3415 Max Sum of Max-K-sub-sequence【单调队列】

    <题目链接> 题目大意: 给你一段从1~N的圆形序列,要你求出这段圆形序列中长度不超过K的最大连续子序列之和是多少,并且输出这子序列的起点和终点. 解题分析: 既然是求连续子序列之和,我们 ...

  4. Codeforces 1037D【BFS】

    <题目链接> 题目大意: 给你一颗树的所有边,这些边是无向的,然后给你一段BFS序列,BFS都以1为根节点,判断这段BFS序列是否合法. 解题分析: 就是模拟BFS,某个父亲节点的所有子节 ...

  5. [译]the cost of javascript in 2018(1)

    前言 为了构建交互性网站,我们需要发送js给我们的用户,但很多情况下,我们使用了太多js. 在移动端,经常看到只加载了个点击链接或者滚动不了的情况. 实话说,js仍然是移动端最昂贵的资源,因为其在很大 ...

  6. 一种表达式语言的解析引擎JEXL简单使用

    Jexl 是一个 Expression Language 的解析引擎, 是为了方便嵌入你的系统或者程序框架的开发中, 他算是实现了 JSTL 中 EL 的延伸版本. 不过也采用了一些 Velocity ...

  7. PHP学习笔记 ThinkPHP

    //检测文件是否存在 if(!file_exists(dirname(__FILE__)."/Bo/Admin/Conf/config.php")) { header('Locat ...

  8. SQL——用FOR XML Path完成字符串的聚合

  9. LOJ.6074.[2017山东一轮集训Day6]子序列(DP 矩阵乘法)

    题目链接 参考yww的题解.本来不想写来但是他有一些笔误...而且有些地方不太一样就写篇好了. 不知不觉怎么写了这么多... 另外还是有莫队做法的...(虽然可能卡不过) \(60\)分的\(O(n^ ...

  10. Python3基础-Python作用域详述(转载)

    转载文章 转载文章 作者:骏马金龙 出处:http://www.cnblogs.com/f-ck-need-u/p/9925021.html Python作用域详述 作用域是指变量的生效范围,例如本地 ...