首页 > 其他分享 >[Unity]通用倒计时接口

[Unity]通用倒计时接口

时间:2024-07-23 20:07:34浏览次数:17  
标签:DownClock OnComplete timer 倒计时 Unity 接口 Action public

1.介绍

游戏开发时还是蛮经常会遇到与时间有关的功能,最近整理了下把游戏在线的倒计时抽出了一个接口。
在线游戏的倒计时通用需求一般有:
1).倒计时的时间,比如树的重生长时间为3分钟,角色死亡复活倒计时需要30秒..
2).可以暂停的功能,比如单机游戏点开设置,那么树的重生长倒计时应该停止;也可以不使用暂停功能,但要提供暂停功能..
3).提供倒计时生命周期的监听回调功能,提供在倒计时开始时、倒计时暂停时、倒计时完成时的监听接口。

开始时的监听大多与事件的结果有关,规范性还是写上,比如在树被砍倒,调用动画和道具逻辑,然后启动重生长倒计时,开始监听调用倒计时UI鼠标悬停在树时显示,游戏暂停时调用重生长的UI、逻辑、动画等暂停,倒计时结束时,树重新到原样,同时关闭倒计时。

2.实现

整体使用一个表里二层的结构来实现上面需求,其中需要一个实现倒计时功能的里层类DownClock,将功能及数据封装在这个类中,提供一些操控接口给表层类TimeMgr,TimeMgr将管理所有的DownClock,并为外部功能模块提供接口。

DownClock类的实现:

点击查看代码
public class DownClock
{
    bool isPause = false;
    bool isOver = false;
    float timer;
    //各个监听
    Action OnStart;
    Action OnPause;
    Action OnResume;
    Action OnComplete;
    public DownClock(float _timer, Action _OnComplete = null)
    {
        timer = _timer;
        OnComplete = _OnComplete;
    }
    public DownClock(float _timer, Action _OnStart = null, Action _OnPause = null, Action _OnResume = null, Action _OnComplete = null)
    {
        timer = _timer;
        OnStart = _OnStart;
        OnPause = _OnPause;
        OnResume = _OnResume;
        OnComplete = _OnComplete;
        OnStart?.Invoke();
    }
    //依托于TimeMgr的mono update
    public void TimeDown(float delta)
    {
        if (isOver || isPause) return;
        timer -= delta;
        if (timer < 0)
        {
            timer = 0f;
            isPause = true;
            isOver = true;
            OnComplete?.Invoke();
        }
    }
    //一些对外功能接口
    public bool GetIsOver()
    {
        return isOver;
    }
    public float GetTimer()
    {
        return timer;
    }
    public void AddTime(float value)
    {
        timer += value;
    }
    public void ResumeClock()
    {
        isPause = false;
        OnResume?.Invoke();
    }
    public void PauseClock()
    {
        isPause = true;
        OnPause?.Invoke();
    }
}

TimeMgr类的部分实现:

点击查看代码
public partial class TimeMgr : Singleton<TimeMgr>
{
    void Awake()
    {
        base.Awake();
        DontDestroyOnLoad(gameObject);
    }
    void Update()
    {
        UpdateDownClocks();
    }
    //这里用List写了个简单的管理与对外接口
    public List<DownClock> down_clocks = new List<DownClock>();
    public void UpdateDownClocks()
    {
        if (down_clocks.Count == 0) return;
        //遍历所有钟,结束的删除,其余的传入delta time倒计时
        for (int i = 0; i < down_clocks.Count; i++)
        {
            DownClock clock = down_clocks[i];
            if (clock.GetIsOver())
            {
                down_clocks.Remove(clock);
                continue;
            }
            clock.TimeDown(Time.deltaTime);
        }
    }
    public void AddDownClock(float timer, Action _OnComplete = null)
    {
        DownClock clock = new DownClock(timer, _OnComplete);
        down_clocks.Add(clock);
    }
    public void AddDownClock(float timer, Action _OnStart = null, Action _OnPause = null, Action _OnResume = null, Action _OnComplete = null)
    {

        DownClock clock = new DownClock(timer,_OnStart,_OnPause,_OnResume,_OnComplete);
        down_clocks.Add(clock);
    }
}
根据不同的功能需求,还可以再对该结构和管理模式进行优化适配。

标签:DownClock,OnComplete,timer,倒计时,Unity,接口,Action,public
From: https://www.cnblogs.com/OrphanRootNode/p/18319366

相关文章

  • unity3d碰撞
    unity3d碰撞 Unity3D提供了多个碰撞事件函数,用于处理不同类型的碰撞情况。常用的碰撞事件函数包括:OnCollisionEnter:当两个物体开始碰撞时触发。这是碰撞的起始点,可以用于执行碰撞开始时的逻辑,如播放碰撞音效、改变游戏状态等。OnCollisionStay:在两个物体持续碰撞的过程中不断......
  • 【Java基础语法】内置接口
    前言:小编紧接着上期抽象类与接口进行了拓展,介绍了一些Java内置有用的接口,希望能够对大家有所帮助。上期博客http://t.csdnimg.cn/0MoDe1.Comparable接口1.1Comparable接口在如下代码中:publicstaticvoidmain(String[]args){Student[]student=newStuden......
  • flask写接口,定制日志输出以及将请求状态以及自定义日志写入文件中
    前言:无论是写接口还是写项目,配置日志是必选的;适合配置可以帮助自己排查代码逻辑问题简单说一说日志的等级以及用处1.日志等级DEBUG:10INFO:20WARN:30ERROR。40CRITICAL:50数字越大,等级越高!!2.日志用处:        DEBUG(调试):用于开发阶段的调试,开启后,会记录程序......
  • Postman接口测试工具的使用
    一、postman简介Postman是一款功能强大的网页调试与发送网页HTTP请求的Chrome插件。作用:常用于进行接口测试。不需要安装。特征:简单,实用,美观,大方。二、Postman接口测试工具的使用Postman不需要安装,使用步骤如下:1)、创建用户,注册登录 2)、创建工作空......
  • 探索绝对值码盘接口系列板卡:高精度测量与控制的关键组件
    天津拓航科技绝对值码盘卡在当今高度自动化和精密制造的时代,准确获取位置、角度和速度等信息对于许多工业和科技应用至关重要。绝对值码盘接口系列板卡作为实现这一目标的重要工具,正发挥着日益关键的作用。绝对值码盘接口系列板卡,顾名思义,是专门设计用于与绝对值码盘进行连接和......
  • 实例说明如何使用Java 8的Function接口使得代码更加简洁以及降低重复性
    什么是Function接口?Function接口是Java8中引入的一个功能性接口,位于java.util.function包下。它代表了一个接受一个参数并产生结果的函数。这个接口只有一个抽象方法apply(Tt),用于对传入的参数应用某种操作并返回一个结果。@FunctionalInterfacepublicinterfaceFunct......
  • @RequestPart-Java接口,同时传参JSON对象数据和文件
    简单介绍前端传递文件参数的时候,通常会使用POST方式传参,将请求header的content-type设置为:multipart/form-data(因为GET请求只能传递文本类型的参数,而文件属于二进制数据,无法直接通过GET方式传递。)前端通过POST传参时,header的content-type设置为"application/json"......
  • SplObserver 和 SplSubject 接口实现观察者模式
    <?phpclassSubjectimplementsSplSubject{private$observers=[];private$state;publicfunctionattach(SplObserver$observer){$this->observers[]=$observer;}publicfunctiondetach(SplObserver$observer){......
  • 阿里云:用php开发短信接口
    一,准备工作:在阿里云控制台->短信服务中,需完成以下三项的配置,等官方审核通过后,则可以使用接口二,下载安装php的sdk1,官方文档地址https://help.aliyun.com/zh/sms/developer-reference/sdk-product-overview/?spm=a2c4g.11186623.0.0.1db061a5jSzBwS2,用composer下载安装liu......
  • python接口自动化(四十)- logger 日志 - 下(超详解)
    宏哥微信粉丝群:https://bbs.csdn.net/topics/618423372 有兴趣的可以扫码加入 1.简介按照上一篇的计划,这一篇给小伙伴们讲解一下:(1)多模块使用logging,(2)通过文件配置logging模块,(3)自己封装一个日志(logging)类。可能有的小伙伴在这里会有个疑问一个logging为什么分两篇的篇幅......