先新建一个空白工程,创建文件夹和三个脚本文件 简单命名一下,设置一下调用的命名空间

循例,相机设置一下

创建一个空物体

然后挂俩脚本

弄一个instance静态单例,再写一个初始化函数

调用命名空间,然后在start函数,调用初始化,确保启动顺序

整一个时间控制的任务类,构造函数

再整一个时间尺度 枚举

unity默认的计时 Time.realtimeSinceStartup 单位是毫秒Millisecond

先整一个region,用来存放方法

先整唯一id的逻辑,声明一下

加一个readonly锁,确保id的写入是单线程

在region里

整一个,获取唯一id的方法 首先加锁,然后while循环,如果id等于int的最大值,就重置成0 布尔判断是否已经被使用

如果没有被使用,直接break挑出,如果已经被使用,就再+1 最后返回id

还是在method这个region里,整一个回收废弃id的方法 遍历id的回收列表,如果有id列表的,移除就好

整一个新的region,用来包 时间任务 相关

整一个时间缓存列表,还有时间任务列表

整一个 添加时间任务 的方法 传参是定时委托回调,延迟,计时单位,定时次数 其中,毫秒是默认处理的,如果不是毫秒的话,延迟需要切换计时单位

调用接口,获取唯一id,然后换算一下,触发时间 然后new一个时间任务,加到时间任务的缓存列表 id列表也把id加上 返回id

继续写一个删除任务的方法,传参是tid 首先弄一个布尔判断,遍历时间任务列表,如果tid匹配,就从任务列表移除,而且tid列表也移除,布尔判断设置为true

如果不存在,有可能这个任务是在缓存时间列表里 再检索一下,如果tid在列表里,也是同理,移除一下就好 最终把是否存在的布尔,返回

继续创建一个替换时间任务的方法 传参也是tid,action回调函数,延迟,时间单位,计数器 也是先基于时间单位,对delay延迟,做单位换算

然后,换算后的时间,加上当前的时间节点 创建新的时间任务 判断布尔,然后遍历任务列表,如果tid相等,就替换任务 如果没有替换成功,有可能在缓存列表,也是遍历缓存任务列表,相同操作就好

写一个检测时间任务是否达成条件的判断函数 先把缓存区的定时任务,加到时间任务列表里 清理缓存任务列表,然后遍历时间任务列表,判断任务的抵达时间,是否大于,当前游戏实际运行的时间,如果大于,就调用callback函数,也是try catch机制,防止callback为空

然后是移除任务的机制,如果计数器是1,说明运行一次就可以直接添加到移除列表了 时间任务列表也是移除了,Index也需要减一,因为后续还会继续遍历,时间任务列表,不然后面继续遍历,可能会报空 如果计数器不止1次,就判断是否为0,设定上,如果是0,就是循环任务 如果不是0,就任务计数-1,然后加上延迟,进入下一次时间计算迭代

整一个update函数,调用检测函数,和回收函数就好

在GameRoot先声明一个tid

然后,整一个默认功能接口

再整一个替换用的函数

添加任务按钮功能,延迟500毫秒,运行1次 还有删除任务按钮功能

再整一个替换任务接口