Если я использую один таймер, все работает отлично и без проблем, это буквально просто разделение этих таймеров на отдельные таймеры.
Я уверен, что пропустил здесь что-то простое, но не могу понять, почему они возвращают один и тот же результат.
Изменить: ясность - mfCurrentTime и mfTimeTravelling возвращают одно и то же значение, и они должны возвращать разные значения от каждого таймера, но они объединяются, как будто существует только один таймер.
Это не так. не действуют как два отдельных таймера, они действуют так, как будто это один таймер.
Изменить 2: При индивидуальном использовании оба таймера возвращают разные значения. значения, правильные значения, которые они должны возвращать. Проблема возникает только тогда, когда оба таймера работают одновременно.
например:
Код: Выделить всё
mfCurrentTimeКод: Выделить всё
mfTimeTravellingКогда оба класса активны, 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");
}
}
}
Код: Выделить всё
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);
}
}
Подробнее здесь: https://stackoverflow.com/questions/403 ... rs-c-sharp