2016-10-30 13 views
0

私はカウントダウンタイマーを使用する複数のクラスを持っていますが、複数のタイマーを使用すると、出力は同じ値を返します。Unity:複数のタイマーの使用C#

1つのタイマーを使用すると、問題なく完全に動作します。文字通り、タイマーを別々のタイマーに分割するだけです。

ここでは簡単なことを忘れてしまいましたが、同じ出力を返す理由を理解できません。

編集:明快 - mfCurrentTimemfTimeTravelling同じ値を返す、と彼らは各タイマから異なる値を返す必要がありますが、一つだけのタイマーがあるかのように、彼らは一緒にマージしています。

彼らは、彼らはそれが1つのタイマーであれば

編集2として行動している2つの別々のタイマーのように行動していません。個別に使用する場合、両方のタイマーは異なる値を返す、彼らは帰国しなければならない正しい値。両方のタイマーが問題が発生するのと同時に実行されている場合のみです。例えば

mfCurrentTime常に継続的にカウントダウン更新が

mfTimeTravellingbool _mbIsTravellingがtrueの場合、時間が経過返す呼び出していることとして、経過、現在の時刻を返します。

両方のクラスがアクティブであるときに、mfCurrentTimeが正しいこと、およびboolが他のクラスのmbIsTravellingためtrueである場合、それはmfCurrentTimeの時間を要します。問題は、1つのタイマーではなく2つの完全に別々のタイマーでなければならないということです。

編集3: @ Abion47の助けがあれば、すべてがうまくいくとの発見につながりました。私は更新メソッドのフラグを含まないだけでした。実際のエラーが私のために大規模な監視だったとき、私はCountdownを問題と呼んでいたやり方で、私はとても固定されていました。私は更新プログラムに条件を追加し、すべてが問題ありません。

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

-

このクラスは、カウントダウンタイマーを使用しています。

このクラスでは、カウントダウンタイマーも使用しています。

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); 
    } 
} 

あるスクリプトの両方で

+0

あなたはどんな「価値」を参照していますか?現在の価値は何ですか?タイマーが正しい値を戻していないと言ったときに、何を意味するのかはまったく分かりません。コードが何をしたいのか現在何をしているのかを明記してください。 – Abion47

+0

@ Abion47私はいくつかの明確さで投稿を更新しました。ありがとう – Christo

+0

@ Albion47彼らは2つの別々のタイマーのように動作していない、彼らは1つのタイマーのように動作しています – Christo

答えて

0

おかげで、あなたはGetTimeElapsedから値を取得しています。この値は、カウントダウンが開始されてからの経過時間です。両方のカウントダウンが同時に開始された場合、同じ数値が返されます。

おそらく、GetTimeRemainingに電話をかけて、合計時間を考慮した値を返しますか?またはGetProgressですか?

+0

@ Albion47タイマーは同時に起動しますが、.update()を呼び出すと、異なる時に、それらの最終結果は、彼らが同時に開始しても異なるでしょう。 – Christo

+0

@Christo Unityがどのようにしているかはわかりませんが、一般に、ゲームエンジンはすべてのゲームオブジェクトに対して同じパスの一部として 'Update'を呼び出します。このパス中、 'Time.deltaTime'は' Update'メソッドを呼び出すたびに同じ値を持ちます。そのため、両方のタイマーは、パス全体で更新されるタイミングにかかわらず、同じ量だけ増分されます。 – Abion47

+0

@Christoまた、私の名前はアルビオンではありません。 – Abion47

関連する問題