先新建一个空白工程,创建文件夹和三个脚本文件 简单命名一下,设置一下调用的命名空间 ![[Pasted image 20230518150044.png]] ![[Pasted image 20230518152933.png]] ![[Pasted image 20230518152939.png]] ![[Pasted image 20230519105612.png]] 循例,相机设置一下 ![[Pasted image 20230518154021.png]] 创建一个空物体 ![[Pasted image 20230518155636.png]] 然后挂俩脚本 ![[Pasted image 20230518163228.png]] 弄一个instance静态单例,再写一个初始化函数 ![[Pasted image 20230519134323.png]] 调用命名空间,然后在start函数,调用初始化,确保启动顺序 ![[Pasted image 20230519134400.png]] 整一个时间控制的任务类,构造函数 ![[Pasted image 20230519134619.png]] 再整一个时间尺度 枚举 ![[Pasted image 20230519134710.png]] unity默认的计时 Time.realtimeSinceStartup 单位是毫秒Millisecond 先整一个region,用来存放方法 ![[Pasted image 20230519134841.png]] 先整唯一id的逻辑,声明一下 ![[Pasted image 20230519135859.png]] 加一个readonly锁,确保id的写入是单线程 ![[Pasted image 20230519140011.png]] 在region里 ![[Pasted image 20230519140159.png]] 整一个,获取唯一id的方法 首先加锁,然后while循环,如果id等于int的最大值,就重置成0 布尔判断是否已经被使用 ![[Pasted image 20230519140127.png]] 如果没有被使用,直接break挑出,如果已经被使用,就再+1 最后返回id ![[Pasted image 20230519140339.png]] 还是在method这个region里,整一个回收废弃id的方法 遍历id的回收列表,如果有id列表的,移除就好 ![[Pasted image 20230519140502.png]] 整一个新的region,用来包 时间任务 相关 ![[Pasted image 20230519141239.png]] 整一个时间缓存列表,还有时间任务列表 ![[Pasted image 20230519142244.png]] 整一个 添加时间任务 的方法 传参是定时委托回调,延迟,计时单位,定时次数 其中,毫秒是默认处理的,如果不是毫秒的话,延迟需要切换计时单位 ![[Pasted image 20230519142611.png]] 调用接口,获取唯一id,然后换算一下,触发时间 然后new一个时间任务,加到时间任务的缓存列表 id列表也把id加上 返回id ![[Pasted image 20230519144319.png]] 继续写一个删除任务的方法,传参是tid 首先弄一个布尔判断,遍历时间任务列表,如果tid匹配,就从任务列表移除,而且tid列表也移除,布尔判断设置为true ![[Pasted image 20230519152114.png]] 如果不存在,有可能这个任务是在缓存时间列表里 再检索一下,如果tid在列表里,也是同理,移除一下就好 最终把是否存在的布尔,返回 ![[Pasted image 20230519152254.png]] 继续创建一个替换时间任务的方法 传参也是tid,action回调函数,延迟,时间单位,计数器 也是先基于时间单位,对delay延迟,做单位换算 ![[Pasted image 20230520113730.png]] 然后,换算后的时间,加上当前的时间节点 创建新的时间任务 判断布尔,然后遍历任务列表,如果tid相等,就替换任务 如果没有替换成功,有可能在缓存列表,也是遍历缓存任务列表,相同操作就好 ![[Pasted image 20230520114257.png]] 写一个检测时间任务是否达成条件的判断函数 先把缓存区的定时任务,加到时间任务列表里 清理缓存任务列表,然后遍历时间任务列表,判断任务的抵达时间,是否大于,当前游戏实际运行的时间,如果大于,就调用callback函数,也是try catch机制,防止callback为空 ![[Pasted image 20230520134908.png]] 然后是移除任务的机制,如果计数器是1,说明运行一次就可以直接添加到移除列表了 时间任务列表也是移除了,Index也需要减一,因为后续还会继续遍历,时间任务列表,不然后面继续遍历,可能会报空 如果计数器不止1次,就判断是否为0,设定上,如果是0,就是循环任务 如果不是0,就任务计数-1,然后加上延迟,进入下一次时间计算迭代 ![[Pasted image 20230520135306.png]] 整一个update函数,调用检测函数,和回收函数就好 ![[Pasted image 20230520135858.png]] 在GameRoot先声明一个tid ![[Pasted image 20230520133840.png]] 然后,整一个默认功能接口 ![[Pasted image 20230520133936.png]] 再整一个替换用的函数 ![[Pasted image 20230520140122.png]] 添加任务按钮功能,延迟500毫秒,运行1次 还有删除任务按钮功能 ![[Pasted image 20230520140154.png]] 再整一个替换任务接口 ![[Pasted image 20230520140256.png]]