Unity中的定时器与延时器
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中的定时器与延时器的更多相关文章
- 关于Unity中的刚体和碰撞器的相关用法(二)
在关于Unity中的刚体和碰撞器的相关用法(一)的基础上 有一个plane平面,一个ball球体,都挂了碰撞器,ball挂了刚体Rigidbody,写了一个脚本ball挂载在球体上,球体从空中落下装机 ...
- 关于Unity中的刚体和碰撞器的相关用法(一)
1.创建一个3D工程 2.构造项目文件目录 3.保存场景为game_scene到文件夹scenes中 4.创建一个Plane平面类型的GameObject节点和一个Sphere球体类型的GameObj ...
- 关于Unity中的定时器和委托
一.Invoke定时器 有3种定时器,这里我们讲Invoke 1.创建一个Canvas 2.对Canvas进行初始化 3.创建一个Image的UI节点作为Canvas的子节点,名字叫bg,拖进背景图片 ...
- 关于Unity中的Mesh Collider碰撞器
原来我的场景中有一个平面Plane带Mesh Collider碰撞器组件,一个主角Hero带有一个Box Collider碰撞器和有重力的Rigidbody刚体组件,主角可以放在平面上. 在导入场景后 ...
- 2.linux系统基础笔记(延时操作、实时系统中的定时器、事件)
延时操作 延时操作是操作系统中经常遇到的一种情形.延时的原因很多,有的时候是为了等待外设芯片处理结束,有的时候是为了暂时释放cpu的使用权,有的就是为了希望在一段时间获取资源,如果没法在单位时间内获取 ...
- Android中几种常用的定时器和延时方法
通过实际项目的练习,掌握了几种android基本定时器和延时的用法,这里我想总结一下作为自己的收获,下面列出的是比较简洁的模式,方便简单地在程序中直接调用. 一.三种常用的定时器 1.Handler类 ...
- JS 定时器/延时器
定时器 创建定时器 window.setInterval(方法类型,间隔时间(1000=1秒)) var timer=window.setInterval(func,2000); var i=0 ...
- unity中使用的着色器语言
在unity中,着色器编程使用了一列列的HLSL语言变种(也叫作Cg,但是大部分实际上两者都是一样的). 目前,为了在不同平台下保持最好的跨平台性, 取样贴图时,最好使用DX9风格 的HLSL. 着色 ...
- 【原创翻译】初识Unity中的Compute Shader
一直以来都想试着自己翻译一些东西,现在发现翻译真的很不容易,如果你直接把作者的原文按照英文的思维翻译过来,你会发现中国人读起来很是别扭,但是如果你想完全利用中国人的语言方式来翻译,又怕自己理解的不到位 ...
随机推荐
- ng2tree在ios中无法触发click
问题描述: 从其他页面跳转回ng2tree的页面时,无法触发节点的click事件 解决方案: 1. 在node_modules中搜索onNodeSeclected方法,修改click为touchend ...
- day10.函数升级
1.写函数,接受n个数字,求这些参数数字的和.(动态传参) def summ(*args): all = 0 for i in args: all = all + i return all ret = ...
- ConcurrentModificationException(并发修改异常)的分析
1)介绍 并发修改ConcurrentModificationException错误是开发中一个常见错误,多发生在对一个Collection边遍历边做影响size变化的操作中,下面以ArrayList ...
- 如何在不使用try语句的情况下查看文件是否存在
如果你要确定文件存在的话然后做些什么,那么使用try是最好不过的 如果您不打算立即打开文件,则可以使用os.path.isfile检查文件 如果path是现有常规文件,则返回true.对于相同的路径, ...
- Python图表数据可视化Seaborn:4. 结构化图表可视化
1.基本设置 import numpy as np import pandas as pd import matplotlib.pyplot as plt import seaborn as sns ...
- Noj - 在线强化训练1
1445 A 求n个整数的和 1564 B 判断一个数是否是完全数 1011 C 判素数(Prime number) 1566 D 输入一组整数,找出最小值 1200 E 判断三角 ...
- POJ 2001 Shortest Prefixes 【Trie树】
<题目链接> 题目大意: 找出能唯一标示一个字符串的最短前缀,如果找不出,就输出该字符串. 解题分析: Trie树的简单应用,对于每个单词的插入,都在相应字符对应的节点 num 值+1 , ...
- Codeforces 998D. Roman Digits 【打表找规律】
<题目链接> 题目大意: 现在有无限个 1,5,10,50这四个数字,从中恰好挑选n个数字,问你这些数字的和总共有多少种不同的情况. 解题分析: 由于此题 n 的范围特别大,达到了1e9, ...
- python系统性能模块笔记
内存信息psutil.cpu_times() 使用cpu_times方法获取cpu完整信息,需要显示所有逻辑cpu信息(指定变量percpu=True)psutil.cpu_ti ...
- SpringBoot使用Jsp
本文是简单总结一下SpringBoot使用Jsp的Demo. 前言 在早期做项目的时候,JSP是我们经常使用的java服务器页面,其实就是一个简化servlet的设计,在本文开始之前,回顾一下jsp的 ...