Unity:使用多个定时器 C#
Unity: Using multiple timers C#
我有多个使用倒数计时器的 classes,但是当我使用多个计时器时,输出 returns 相同的值,而不是特定于它们自己的两个单独值 class.
如果我使用一个定时器,一切都完美无缺,实际上只是将这些定时器拆分成单独的定时器。
我确定我在这里漏掉了一些简单的东西,但无法弄清楚为什么它们 return 输出相同。
编辑: 清晰度 - mfCurrentTime
和 mfTimeTravelling
return 相同的值,它们应该 return 不同的值每个计时器,但它们合并在一起,就好像只有一个计时器一样。
它们不像两个独立的计时器那样工作,它们就像一个计时器一样工作
编辑2:单独使用时,两个定时器return不同的值,正确的值应该是returning。只有当两个计时器同时为 运行 时才会出现问题。
例如:
mfCurrentTime
将始终 return 当前时间,因为它不断调用倒计时更新
mfTimeTravelling
returns 当 bool _mbIsTravelling
为真时经过的时间。
当两个 class 都处于活动状态时,mfCurrentTime
是正确的,而当 bool
是 true
for mbIsTravelling
在另一个 class,需要mfCurrentTime
的时间。问题是它们应该是两个完全独立的计时器,而不是一个计时器。
编辑 3: @Abion47 的帮助导致发现一切正常,我只是没有在 Update 方法中包含更新标志。当真正的错误是代表我的大规模疏忽时,我是如此固定地认为倒计时是问题所在。我在更新中添加了一个条件,一切正常。
if(_mbIsTravelling)
{
mIsTravellinTimer.Update();
}
-
此 class 正在使用倒数计时器。
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");
}
}
}
这个 class 也在使用倒数计时器。
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");
}
}
}
和倒计时 class,(用于处理计时器等的通用 class)在这里
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);
}
}
谢谢
在您的两个脚本中,您都从 GetTimeElapsed
获取值。该值是自倒计时开始以来经过的时间量,如果同时开始两个倒计时,则会得到相同的数字。
也许您打算调用 GetTimeRemaining
,其中 returns 是一个将给定的总时间考虑在内的值?或者 GetProgress
?
我有多个使用倒数计时器的 classes,但是当我使用多个计时器时,输出 returns 相同的值,而不是特定于它们自己的两个单独值 class.
如果我使用一个定时器,一切都完美无缺,实际上只是将这些定时器拆分成单独的定时器。
我确定我在这里漏掉了一些简单的东西,但无法弄清楚为什么它们 return 输出相同。
编辑: 清晰度 - mfCurrentTime
和 mfTimeTravelling
return 相同的值,它们应该 return 不同的值每个计时器,但它们合并在一起,就好像只有一个计时器一样。
它们不像两个独立的计时器那样工作,它们就像一个计时器一样工作
编辑2:单独使用时,两个定时器return不同的值,正确的值应该是returning。只有当两个计时器同时为 运行 时才会出现问题。
例如:
mfCurrentTime
将始终 return 当前时间,因为它不断调用倒计时更新
mfTimeTravelling
returns 当 bool _mbIsTravelling
为真时经过的时间。
当两个 class 都处于活动状态时,mfCurrentTime
是正确的,而当 bool
是 true
for mbIsTravelling
在另一个 class,需要mfCurrentTime
的时间。问题是它们应该是两个完全独立的计时器,而不是一个计时器。
编辑 3: @Abion47 的帮助导致发现一切正常,我只是没有在 Update 方法中包含更新标志。当真正的错误是代表我的大规模疏忽时,我是如此固定地认为倒计时是问题所在。我在更新中添加了一个条件,一切正常。
if(_mbIsTravelling)
{
mIsTravellinTimer.Update();
}
-
此 class 正在使用倒数计时器。
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");
}
}
}
这个 class 也在使用倒数计时器。
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");
}
}
}
和倒计时 class,(用于处理计时器等的通用 class)在这里
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);
}
}
谢谢
在您的两个脚本中,您都从 GetTimeElapsed
获取值。该值是自倒计时开始以来经过的时间量,如果同时开始两个倒计时,则会得到相同的数字。
也许您打算调用 GetTimeRemaining
,其中 returns 是一个将给定的总时间考虑在内的值?或者 GetProgress
?