Unity 游戏框架搭建 2019 (四十三) 定时功能
今天我们再接着往下学习。
第十一个示例
我们都知道,在项目中,我们会遇到非常多的定时需求。而定时功能在 Unity 中最容易实现的方式是通过 Coroutine(协程)实现。在这个示例中我们实现一个简单的定时工具。
在实现在哪里呢?
我们目前有两个选择:
-
一是写一个工具类,比如 TimerUtil 或者 DelayUtil,或者干脆卸载 CommonUtil 里。 二是实现到 MonoBehaviourSimplify 里。
考虑到,执行协程是需要通过 MonoBehaviour 启动的,所以方法在 MonoBehaviourSimplify 中定义更好一点。而实现的部分需要定义一个协程方法。这个协程方法并不希望被子类或者外部类调用,所以这个协程方法应该使用 private 权限。
实现之后的示例代码如下:
using System;
using System.Collections;
using UnityEngine;
namespace QFramework
{
public partial class MonoBehaviourSimplify
{
public void Delay(float seconds, Action onFinished)
{
StartCoroutine(DelayCoroutine(seconds, onFinished));
}
private static IEnumerator DelayCoroutine(float seconds, Action onFinished)
{
yield return new WaitForSeconds(seconds);
onFinished();
}
}
public class DelayWithCoroutine : MonoBehaviourSimplify
{
private void Start()
{
Delay(5.0f, () =>
{
UnityEditor.EditorApplication.isPlaying = false;
});
}
#if UNITY_EDITOR
[UnityEditor.MenuItem("QFramework/11.定时功能", false, 11)]
private static void MenuClickd()
{
UnityEditor.EditorApplication.isPlaying = true;
new GameObject("DelayWithCoroutine")
.AddComponent<DelayWithCoroutine>();
}
#endif
}
}
以上代码中,大家可能对 Action 比较陌生。Action 其实是 C# 自定义的委托。 定义如下:
namespace System
{
public delegate void Action();
}
至于委托是什么…,理解成动态方法就好了,在初期呢,我们用它来做回调函数。
还有这样的一个写法也可能比较陌生: () => { } ,这种写法叫做 lambda 表达式,相当于实现了一个没有名字的方法。详细的使用方法可以自己用搜索引擎查一下,这里笔者只要能看懂以上代码就行。当然在以后的文章中会非常深入地讲 委托、lambda 表达式在库/框架中的使用的。
示例代码执行之后,如下: 过了五秒后,UnityEditor 运行会自动停止。 如下:
结果是正确的。
这篇文章的示例就写完了。
菜单栏如下:
文件目录如下:
我们可以进行一次导出了。
我们一篇文章再见,拜拜~
更多内容
-
QFramework 地址: Unity 进阶小班: 主要训练内容: 框架搭建训练(第一年) 跟着案例学 Shader(第一年) 副业的孵化(第二年、第三年) 权益、授课形式等具体详情请查看:https://liangxiegame.com/master/intro
下一篇:
xxx系统可用性和易用性分析
