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. Zabbix微信报警触发

    (1)         企业应用-创建应用 1.除了对个人添加微信报警之外,还可以添加不同管理组,接受同一个应用推送的消息, 成员账号,组织部门ID,应用Agent ID,CorpID和Secret, ...

  2. js网页下载csv格式的表格

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  3. BZOJ1066 [SCOI2007]蜥蜴 网络流 最大流 SAP

    由于本题和HDU2732几乎相同,所以读者可以看-> HDU2732题解传送门: http://www.cnblogs.com/zhouzhendong/p/8362002.html

  4. Python交互图表可视化Bokeh:5 柱状图| 堆叠图| 直方图

    柱状图/堆叠图/直方图 ① 单系列柱状图② 多系列柱状图③ 堆叠图④ 直方图 1.单系列柱状图 import numpy as np import pandas as pd import matplo ...

  5. tp5数据库链接

    1在config/database.php中配置 1.1直接 return [ // 数据库类型 'type' => 'mysql', // 服务器地址 'hostname' => '12 ...

  6. python爬虫积累(一)--------selenium+python+PhantomJS的使用(转)

    阅读目录 一.Selenium介绍 二.爬虫为什么要用selenium? 三.PhantomJS介绍 四.PhantomJS安装 五.操作实战 六.在此推荐虫师博客的学习资料 selenium + p ...

  7. 用Eclipse上传项目到github

    1.安装EGit插件 点击菜单栏help->Eclipse Marketplace 2.配置Git 这里是配置相关账户信息 3.把项目提交到本地仓库 右键项目->Team->Shar ...

  8. poj 3368 Frequent values(经典)【RMQ】

    <题目链接> 题目大意: 给你一个长度为n的序列,这个序列每个数都有一个值,接下来进行q次询问,问在指定区间内出现次数最多的数出现了几次. 解题分析: 因为该序列是非降序的,所以该序列中的 ...

  9. MyEclipse、Eclipse使用配置及部分问题

    简单总结一下myeclipse首次使用的配置,eclipse类似.总结的不是很全面,如有新的看法,欢迎下方留言. 最优设置 1.myeclipse激活 myeclipse.eclipse程序及激活工具 ...

  10. linux 学习笔记 groupadd创建组

    1> groupadd -g test2 2>usermod -d /home/test -G test2 test 3>su user 4>groups 注意:root用户才 ...