unity游戏的开始和暂停 计时器

"这篇博客介绍了一个Unity游戏场景中如何通过自定义`Timer`和`MyTime`类来实现场景的暂停和继续功能。`Timer`类负责订阅和触发更新事件,而`MyTime`类用于管理指定时间间隔内的操作,支持开始、停止、继续和重置。用户可以通过按"W"键暂停,按"S"键继续游戏进程。示例代码详细展示了这两个类的实现和交互方式。"
摘要由CSDN通过智能技术生成
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

/// <summary>
/// 实现控制 游戏的暂停和继续功能
/// 对于动画暂停可以 mMoveTween.timeScale = timeScale
/// </summary>
public class Timer : MonoBehaviour
{
    public event Action TimerUpdate;
    public MyTime MyTime1;
    public MyTime MyTime2;
    // Start is called before the first frame update
    void Start()
    {
        int count = 1;
        MyTime myTime1 = new MyTime(() => { print(1); count++; }, 5f, -1, false);
        TimerUpdate += myTime1.Update;
        myTime1.Start();
        MyTime1 =myTime1;
        //int count2 = 1;
        //MyTime myTime2 = new MyTime(() => { print(2); count2--; }, 5, 4, false);
        //TimerUpdate += myTime2.Update;
        //myTime2.Start();
        //MyTime2 = myTime2;
    }

    // Update is called once per frame
    void Update()
    {
        TimerUpdate();

        if (Input.GetKeyDown(KeyCode.W))
        {
            MyTime1.Stop(); //MyTime2.Stop();
        }

        if (Input.GetKeyDown(KeyCode.S))
        {
            MyTime1.Continue();// MyTime2.Continue();
        }
    }
}

public class MyTime
{
    private Action _fun;//需要执行的函数
    private float _duration;//时间间隔
    private float _time;//存储时间间隔  注意最小间隔
    private int _loop;//循环次数
    private bool _unscaled;//是否时间缩放
    public MyTime(Action fun,float duration,int loop,bool unscaled)
    {
        _fun = fun;
        _duration = _time = duration;
        _loop = loop;
        _unscaled = unscaled;
    }

    public void Reset(Action fun, float duration, int loop, bool unscaled)
    {
        _fun = fun;
        _duration = _time = duration;
        _loop = loop;
        _unscaled = unscaled;
        _isEnding = false;
        _running = true;
    }

    private bool _isEnding = false;//是否结束
    private bool _running = false;//是否运行
    public void Start()
    {
        _running = true;
    }

    public void End()
    {
        _isEnding = true;
        _running = false;
    }

    public void Stop()
    {
        if (!_isEnding)
        {
            _running = false;
        }
    }

    public void Continue()
    {
        if (!_isEnding)
        {
            _running = true;
        }    
    }


    public void Update()
    {
        if (!_running) return;

        float delta = _unscaled ? Time.unscaledDeltaTime : Time.deltaTime;
        _time -= delta;
        if (_time <= 0)
        {
            
            if (_loop > 0)
            {
                _loop--;
                _time += _duration;
            }

            if (_loop == 0)
            {
                End();
            }
            else if (_loop < 0)
            {
                _time += _duration;
            }
            _fun();
        }

    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值