Unity:使用多个计时器 C#

问题描述 投票:0回答:1

我有多个使用倒数计时器的类,但是当我使用多个计时器时,输出返回相同的值,而不是特定于其自己的类的两个单独的值。

如果我使用一个计时器,一切都会完美运行,没有任何问题,实际上只是将这些计时器分成单独的计时器。

我确信我在这里错过了一些简单的东西,但无法弄清楚为什么它们返回相同的输出。

编辑:清晰度 -

mfCurrentTime
mfTimeTravelling
返回相同的值,它们应该从每个计时器返回不同的值,但它们合并在一起,就好像只有一个计时器一样。

它们的行为不像两个独立的计时器,它们的行为就像一个计时器

编辑2:单独使用时,两个计时器返回不同的值,即它们应该返回的正确值。只有当两个计时器同时运行时才会出现问题。

例如:

mfCurrentTime
将始终返回当前经过的时间,因为它不断调用倒计时更新

mfTimeTravelling
返回当
bool _mbIsTravelling
为 true 时经过的时间。

当两个班级都活跃时,

mfCurrentTime
是正确的,而当另一个班级的
bool
true
mbIsTravelling
时,则需要
mfCurrentTime
的时间。问题是它们应该是两个完全独立的计时器,而不是一个计时器。

编辑 3: @Abion47 的帮助导致我发现一切都正常工作,我只是没有在 Update 方法中包含更新标志。我非常固执地认为倒计时是问题所在,而真正的错误是我的巨大疏忽。我在更新中添加了一个条件,一切都很好。

if(_mbIsTravelling)
{
    mIsTravellinTimer.Update();
}

-

本课程使用倒计时器。

public class Level_TimeTaken : MonoBehaviour
    {
    public EndOfLevelElement UIElement;

    [HideInInspector]
    public float mfCurrentTime;
    [HideInInspector]
    public string msTimeTaken;

    private bool _mbLevelIsActive;
    private Countdown mLevelTime = new Countdown(9999.0f);

    void Start()
    {
        mLevelTime.Reset();
        _mbLevelIsActive = true;
    }

    void Update()
    {
        mLevelTime.Update();
        TimerRunning();
        UIElement.GetTimeTaken(msTimeTaken);
    }

    private void TimerRunning()
    {
        if (_mbLevelIsActive)
        {
            mfCurrentTime = mLevelTime.GetTimeElapsed();
            msTimeTaken = mfCurrentTime.ToString("#.00");
        }
    }
}

本课程还使用倒计时器。

public class Level_DistanceTravelled : MonoBehaviour
{
    public EndOfLevelElement UIElement;

    [HideInInspector]
    public float mfTimeTravelling;
    [HideInInspector]
    public string msDistanceTravelled;

    private bool _mbIsTravelling;
    private Countdown mIsTravellinTimer = new Countdown(6000.0f);

    void Start()
    {
        mIsTravellinTimer.Reset();
    }

    void Update()
    {
        mIsTravellinTimer.Update();
        DistanceTravelling();
        UIElement.GetDistanceTravelled(msDistanceTravelled);
    }

    private void DistanceTravelling()
    {
        if (GMM.Instance.Input.ShouldLHorizontalKeyLeft() || GMM.Instance.Input.ShouldLHorizontalKeyRight() || GMM.Instance.Input.ShouldLHorizontalAxis() != 0.0f)
        {
            _mbIsTravelling = true;
        }
        else
        {
            _mbIsTravelling = false;
        }

        if (_mbIsTravelling)
        {
            // add math for working out distance so the string displays meters spooled
            mfTimeTravelling = mIsTravellinTimer.GetTimeElapsed();
            msDistanceTravelled = mfTimeTravelling.ToString("#.00");
        }
    }
}

还有 Countdown 类(用于处理计时器等的通用类)在这里

public class Countdown
{
    private float _mfCountdownTime;
    private float _mfCurrentTime;

    public Countdown(float lfCountdownTime)
    {
        _mfCountdownTime = lfCountdownTime;
        _mfCurrentTime = 0f;
    }

    public void Update()
    {
        Update(Time.deltaTime);
    }

    public void Update(float lfTimeStep)
    {
        _mfCurrentTime += lfTimeStep;
        if (_mfCurrentTime > _mfCountdownTime)
        {
            _mfCurrentTime = _mfCountdownTime;
        }
    }

    public bool IsComplete()
    {
        return _mfCurrentTime >= _mfCountdownTime;
    }

    public void SetComplete()
    {
        _mfCurrentTime = _mfCountdownTime;
    }

    public void Reset()
    {
        _mfCurrentTime = 0f;
    }

    public float GetTimeElapsed()
    {
        return _mfCurrentTime;
    }

    public float GetTimeRemaining()
    {
        return _mfCountdownTime - _mfCurrentTime;
    }

    public float GetProgress()
    {
        return Mathf.Clamp01(_mfCurrentTime / _mfCountdownTime);
    }
}

谢谢

c# unity-game-engine
1个回答
0
投票

在您的两个脚本中,您都从

GetTimeElapsed
获取值。该值是自倒计时开始以来经过的时间量,如果两个倒计时同时开始,则会给出相同的数字。

也许您打算调用

GetTimeRemaining
,它返回一个考虑了给定总时间的值?或者也许
GetProgress

© www.soinside.com 2019 - 2024. All rights reserved.