【Unity3d】设计自己的计时类

程序和游戏中往往有很多需要计时的地方,比如很多日常任务是领取后倒计时到了就可以完成的。于是之前做游戏的时候设计了一个计时类Timer,需要使用的时候实例化一个Timer,并且在Update中进行计时即可。
首先确定实现计时器需要哪些变量和功能。我们需要判断计时器是否在工作,总的计时时长,当前的计时时长和计时的进程。我们还需要一些简单的方法,如开始,暂停,恢复,停止等,当然在各个方法执行的时候能够针对不同的情况相应一些事件也是必须的,不然这个计时器就不具备了通用性。知道了这些我们就可以开始设计我们的计时器了,其中计时器已秒为单位,我们可以进行更改定义自己需要的单位。
首先定义一些变量,这里使用了Get和Set来设置属性。

private bool _running;
private float _curTime;
private float _targetTime;
private float _process;

public float tartetTime
{
    get { return _targetTime; }
}

public float process
{
    get
    {
        return _process;
    }
    set
    {
        _process = Mathf.Clamp01(value);
        _curTime = _targetTime * _process;
    }
}

public bool IsRunning()
{
    return _running;
}

然后我们用委托机制来实现我们需要自定义的事件。

public delegate void EventHandler();

// 计时器开始事件
public event EventHandler startEvent;
// 计时器计时事件
public event EventHandler tickEvent;
// 计时器结束事件
public event EventHandler endEvnet;
// 计时器暂停事件
public event EventHandler pauseEvent;
// 计时器停止事件
public event EventHandler stopEvent;
// 计时器重置事件
public event EventHandler resetEvent;

当我们实例化一个Timer对象之后,只需添加对应的事件即可,当然是用+=时不要忘记在合适的事件对应地-=。

Timer timer = new Timer();

void OnEnable()
{
    timer.endEvent += OnTimerEnd;
}

void OnDisable()
{
    timer.endEvent -= OnTimerEnd;
}

void OnTimerEnd() 
{
    Debug.Log("Timer End");
}

当然我们实例化计时类的时候需要一个目标值,并且设置是否自动启动计时器。当然我们也可以定义一些自己需要的内容,比如在特定的时间点处启动等。代码如下:

public Timer(float target, bool autoStart)
{
    if (target < 0)
    {
#if UNITY_EDITOR
        Debug.Log("Target time must larger than 0");
#endif
        target = 0;
    }

    _targetTime = target;
    _curTime = 0;
    _process = 0;
    _running = autoStart;
}

最后就是控制计时器的一个方法,比如开始,暂停之类的,在每个方法中调用定义的委托事件。在调用之前需要先判断一下是否有委托,不然会报错。

public void TimerStart()
{
    _running = true;
    if (startEvent != null)
        startEvent();
}

public void TimerPause()
{
    _running = false;
    if (pauseEvent != null)
        pauseEvent();
}

public void TimerStop()
{
    _process = 0;
    _curTime = 0;
    _running = false;
    if (stopEvent != null)
        stopEvent();
}

public void TimerReset()
{
    _process = 0;
    _curTime = 0;
    _running = false;
    if (resetEvent != null)
        resetEvent();
}

public void ReStartTimer()
{
    _process = 0;
    _curTime = 0;
    _running = true;
    if (startEvent != null)
        startEvent();
}

最后也是最重要的一个函数,就是实现计时器计时功能的方法,这个方法需要在脚本的Update中进行调用,或者在协程等一些可以计时的地方进行调用。我们给这个函数传入一个float类型的时间间隔,让计时器不断更新当前时间,当进行到达1的时候计时就结束了。

public void TimerTick(float deltaTime)
{
    if (_running)
    {
        _curTime += deltaTime;
        _process = _curTime / _targetTime;
        if (tickEvent != null)
            tickEvent();

        if (_process >= 1)
        {
            _process = 1;
            _curTime = _targetTime;
            _running = false;
            if (endEvnet != null)
                endEvnet();
        }
    }
}

在我们需要使用计时器的脚本中,建议先判断计时器是否为null来避免我们删除计时器后的报错情况:

Timer timer = new Timer(60, true);

void Update()
{
    if(timer != null)
}

源码:
百度网盘
密码:nvfg

by:蒋志杰

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: Unity3D是一款强大的游戏开发引擎,非常适合制作答题游戏。首先,我们可以利用Unity3D的场景编辑器来创建游戏的场景,包括背景、道具、角色等。接着,我们可以使用Unity3D的脚本系统来编写游戏的逻辑代码。 在游戏开始前,我们可以设计一个开始界面,用来显示游戏的标题、规则说明等信息。在点击开始按钮后,游戏进入问题界面。我们可以使用Unity3D的UI工具创建问题界面,包括问题文本、选项按钮等。然后,我们可以编写脚本代码来随机生成问题,并根据选项按钮的点击情况来判断答案是否正确。如果答案正确,可以给予玩家积分奖励;如果答案错误,可以扣除玩家的生命值。 除了基本的问题界面外,我们还可以利用Unity3D的特效系统来增加游戏的趣味性。例如,当玩家选择正确答案时,可以播放一个特效动画或者发出一个庆祝声音;当玩家选择错误答案时,可以播放一个失败动画或者发出警告声音。此外,我们还可以在游戏中设置倒计时功能,限制玩家的答题时间,增加游戏的挑战性。 最后,在游戏结束时,我们可以设计一个结束界面,显示玩家的得分情况以及排行榜信息。玩家可以选择重新开始游戏或退出游戏。 总而言之,利用Unity3D制作一个答题游戏是非常可行的。通过合理地运用场景编辑器、脚本系统和特效系统,我们可以创造出一个有趣而富有挑战的答题游戏,给玩家带来乐趣和挑战。 ### 回答2: Unity3D是一款强大的游戏开发引擎,它提供了丰富的功能和工具,非常适合制作各种型的游戏,包括答题游戏。 首先,在Unity中创建一个场景,设计游戏界面,可以包括答题区域、分数显示、计时器等元素。然后,导入题库数据,包括题目、选项和答案,并根据需要自定义题目型,如选择题、判断题等。 接下来,编写脚本实现游戏逻辑。首先,需要根据题库数据生成随机题目,在答题区域显示题目和选项。玩家选择答案后,根据答案的正确性给予相应的反馈,更新分数并计时器。如果回答正确,可以播放音效或动画来增加游戏趣味性。 在游戏进行中,可以设置不同的关卡或难度,增加题目数量或加大难度,以挑战玩家的智力和反应能力。同时,还可以设计其他游戏元素,如道具、奖励等,用于增加游戏的趣味性和可玩性。 最后,制作游戏的UI界面,包括开始菜单、游戏设置等,增加游戏的可操作性和用户体验。并且,为了适应不同设备的屏幕大小,还可以进行屏幕适配和优化。 总之,使用Unity3D制作答题游戏非常简单和灵活,只需要进行场景设计、题目导入、逻辑编写和界面制作等步骤即可。通过合理的设计和开发,可以制作出具有挑战性和娱乐性的答题游戏,给玩家带来愉快的游戏体验。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值