计时器效果图:
Timer用法:
第一种:脚本加到物体上,勾选"自动计时"。
第二种:脚本加到物体上,调用timer.start()方法启动。
第三种:代码中动态添加Timer脚本。
using UnityEngine; public class TimerTest : MonoBehaviour { private void Start () { // 创建一个Timer并开始计时 gameObject.AddComponent<Timer>().start(1.5f, onTimeup); // 倒计时3秒 gameObject.AddComponent<Timer>().start(1, 3, onCD, onCDEnd); // 无限计数(repeatCount为<=0时 无限重复) gameObject.AddComponent<Timer>().start(1, -1, onCount, null); // Timer API Timer timer = gameObject.AddComponent<Timer>(); timer.delay = 10;// 延迟10秒开始 timer.start(); // 开始计时 timer.stop(); // 暂停计时 timer.reset(); // 重置已计时的时间和次数 timer.restart();// 重新开始计时 reset() + start() } /// <summary> 正常计时 </summary> private void onTimeup(Timer timer) { print("计时完成"); } /// <summary> 倒计时间隔 </summary> private void onCD(Timer timer) { print(timer.repeatCount - timer.currentCount); // 3, 2, 1 } /// <summary> 倒计时结束 </summary> private void onCDEnd(Timer timer) { print(timer.repeatCount - timer.currentCount); // 0 } /// <summary> 无限计数 </summary> private void onCount(Timer timer) { print(timer.currentCount); // 1, 2, 3…… } }
Timer API:
// 开始/继续计时 public void start() {} // 暂停计时 public void stop() {} // 停止Timer并重置数据 public void reset() {} // 重置数据并重新开始计时 public void restart() {} // 开始计时 time时间(秒) onComplete(Timer timer)计时完成回调事件 public void start(float time, TimerCallback onComplete) {} // 开始计时 interval计时间隔 repeatCount重复次数 onComplete(Timer timer)计时完成回调事件 public void start(float interval, int repeatCount, TimerCallback onComplete) {} // 开始计时 interval计时间隔 repeatCount重复次数 // onInterval(Timer timer)计时间隔回调事件 // onComplete(Timer timer)计时完成回调事件 public void start(float interval, int repeatCount, TimerCallback onInterval, TimerCallback onComplete) {}
Timer.cs
using UnityEngine; using UnityEngine.Events; /// <summary> /// 计时器 /// <para>ZhangYu 2018-04-08</para> /// </summary> public class Timer : MonoBehaviour { // 延迟时间(秒) public float delay = 0; // 间隔时间(秒) public float interval = 1; // 重复次数 public int repeatCount = 1; // 自动计时 public bool autoStart = false; // 自动销毁 public bool autoDestory = true; // 当前时间 public float currentTime = 0; // 当前次数 public int currentCount = 0; // 计时间隔 public UnityEvent onIntervalEvent; // 计时完成 public UnityEvent onCompleteEvent; // 回调事件代理 public delegate void TimerCallback(Timer timer); // 上一次间隔时间 private float lastTime = 0; // 计时间隔 private TimerCallback onIntervalCall; // 计时结束 private TimerCallback onCompleteCall; private void Start () { enabled = autoStart; } private void FixedUpdate () { if (!enabled) return; addInterval(Time.deltaTime); } /// <summary> 增加间隔时间 </summary> private void addInterval(float deltaTime) { currentTime += deltaTime; if (currentTime < delay) return; if (currentTime - lastTime >= interval) { currentCount++; lastTime = currentTime; if (repeatCount <= 0) { // 无限重复 if (currentCount == int.MaxValue) reset(); if (onIntervalCall != null) onIntervalCall(this); if (onIntervalEvent != null) onIntervalEvent.Invoke(); } else { if (currentCount < repeatCount) { //计时间隔 if (onIntervalCall != null) onIntervalCall(this); if (onIntervalEvent != null) onIntervalEvent.Invoke(); } else { //计时结束 stop(); if (onCompleteCall != null) onCompleteCall(this); if (onCompleteEvent != null) onCompleteEvent.Invoke(); if (autoDestory && !enabled) Destroy(this); } } } } /// <summary> 开始/继续计时 </summary> public void start() { enabled = autoStart = true; } /// <summary> 开始计时 </summary> /// <param name="time">时间(秒)</param> /// <param name="onComplete(Timer timer)">计时完成回调事件</param> public void start(float time, TimerCallback onComplete) { start(time, 1, null, onComplete); } /// <summary> 开始计时 </summary> /// <param name="interval">计时间隔</param> /// <param name="repeatCount">重复次数</param> /// <param name="onComplete(Timer timer)">计时完成回调事件</param> public void start(float interval, int repeatCount, TimerCallback onComplete) { start(interval, repeatCount, null, onComplete); } /// <summary> 开始计时 </summary> /// <param name="interval">计时间隔</param> /// <param name="repeatCount">重复次数</param> /// <param name="onInterval(Timer timer)">计时间隔回调事件</param> /// <param name="onComplete(Timer timer)">计时完成回调事件</param> public void start(float interval, int repeatCount, TimerCallback onInterval, TimerCallback onComplete) { this.interval = interval; this.repeatCount = repeatCount; onIntervalCall = onInterval; onCompleteCall = onComplete; reset(); enabled = autoStart = true; } /// <summary> 暂停计时 </summary> public void stop() { enabled = autoStart = false; } /// <summary> 停止Timer并重置数据 </summary> public void reset(){ lastTime = currentTime = currentCount = 0; } /// <summary> 重置数据并重新开始计时 </summary> public void restart() { reset(); start(); } }
TimerEditor.cs
using UnityEditor; using UnityEngine; /// <summary> /// 计时器 编辑器 /// <para>ZhangYu 2018-04-08</para> /// </summary> [CanEditMultipleObjects] [CustomEditor(typeof(Timer))] public class TimerEditor : Editor { public override void OnInspectorGUI() { Timer script = (Timer)target; // 重绘GUI EditorGUI.BeginChangeCheck(); // 公开属性 drawProperty("delay", "延迟时间(秒)"); drawProperty("interval", "间隔时间(秒)"); drawProperty("repeatCount", "重复次数"); if (script.repeatCount <= 0) EditorGUILayout.LabelField(" ", "<=0 时无限重复", GUILayout.ExpandWidth(true)); EditorGUILayout.BeginHorizontal(); drawProperty("autoStart", "自动计时"); drawProperty("autoDestory", "自动销毁"); EditorGUILayout.EndHorizontal(); // 只读属性 GUI.enabled = false; drawProperty("currentTime", "当前时间(秒)"); drawProperty("currentCount", "当前次数"); GUI.enabled = true; // 回调事件 drawProperty("onIntervalEvent", "计时间隔事件"); drawProperty("onCompleteEvent", "计时完成事件"); if (EditorGUI.EndChangeCheck()) serializedObject.ApplyModifiedProperties(); } private void drawProperty(string property, string label) { EditorGUILayout.PropertyField(serializedObject.FindProperty(property), new GUIContent(label), true); } }
相关文章:
用PEAR::Benchmarking之Timer实现PHP程序计时
如何使用纯PHP实现定时器任务(Timer),定时器timer
相关视频:
以上是简要分析Unity计时器脚本Timer的用法(附代码)的详细内容。更多信息请关注PHP中文网其他相关文章!

要开始C#.NET开发,你需要:1.了解C#的基础知识和.NET框架的核心概念;2.掌握变量、数据类型、控制结构、函数和类的基本概念;3.学习C#的高级特性,如LINQ和异步编程;4.熟悉常见错误的调试技巧和性能优化方法。通过这些步骤,你可以逐步深入C#.NET的世界,并编写高效的应用程序。

C#和.NET的关系是密不可分的,但它们不是一回事。C#是一门编程语言,而.NET是一个开发平台。C#用于编写代码,编译成.NET的中间语言(IL),由.NET运行时(CLR)执行。

C#.NET依然重要,因为它提供了强大的工具和库,支持多种应用开发。1)C#结合.NET框架,使开发高效便捷。2)C#的类型安全和垃圾回收机制增强了其优势。3).NET提供跨平台运行环境和丰富的API,提升了开发灵活性。

C#.NETisversatileforbothwebanddesktopdevelopment.1)Forweb,useASP.NETfordynamicapplications.2)Fordesktop,employWindowsFormsorWPFforrichinterfaces.3)UseXamarinforcross-platformdevelopment,enablingcodesharingacrossWindows,macOS,Linux,andmobiledevices.

C#和.NET通过不断的更新和优化,适应了新兴技术的需求。1)C#9.0和.NET5引入了记录类型和性能优化。2).NETCore增强了云原生和容器化支持。3)ASP.NETCore与现代Web技术集成。4)ML.NET支持机器学习和人工智能。5)异步编程和最佳实践提升了性能。

c#.netissutableforenterprise-levelapplications withemofrosoftecosystemdueToItsStrongTyping,richlibraries,androbustperraries,androbustperformance.however,itmaynotbeidealfoross-platement forment forment forment forvepentment offependment dovelopment toveloperment toveloperment whenrawspeedsportor whenrawspeedseedpolitical politionalitable,

C#在.NET中的编程过程包括以下步骤:1)编写C#代码,2)编译为中间语言(IL),3)由.NET运行时(CLR)执行。C#在.NET中的优势在于其现代化语法、强大的类型系统和与.NET框架的紧密集成,适用于从桌面应用到Web服务的各种开发场景。

C#是一种现代、面向对象的编程语言,由微软开发并作为.NET框架的一部分。1.C#支持面向对象编程(OOP),包括封装、继承和多态。2.C#中的异步编程通过async和await关键字实现,提高应用的响应性。3.使用LINQ可以简洁地处理数据集合。4.常见错误包括空引用异常和索引超出范围异常,调试技巧包括使用调试器和异常处理。5.性能优化包括使用StringBuilder和避免不必要的装箱和拆箱。


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

PhpStorm Mac 版本
最新(2018.2.1 )专业的PHP集成开发工具

适用于 Eclipse 的 SAP NetWeaver 服务器适配器
将Eclipse与SAP NetWeaver应用服务器集成。

SublimeText3 英文版
推荐:为Win版本,支持代码提示!

Atom编辑器mac版下载
最流行的的开源编辑器

Dreamweaver Mac版
视觉化网页开发工具