2017-08-09 9 views
0

で私は0から1まで値を大きくし、だから今値はそのロジックを持って戻っ0は0から1までの値の範囲で画像バーを視覚化して0に戻しユニティ

private Image cycleBar; 
private float currentTime = 0; 
private float cycleDuration = 5; 

private void Start() 
{ 
    cycleBar = GetComponent<Image>(); 
    UpdateCycleBar(); 
} 

private void Update() // TimeHandler 
{ 
    currentTime = Mathf.PingPong(Time.time * 1/cycleDuration, 1); // handle the time 
    UpdateCycleBar(); 
} 

private void UpdateCycleBar() 
{ 
    // the missing part 
} 

にそれを減らします。どのように私はここに、この例のように、それを視覚化することができます

enter image description here

値1に達すると、バーが右に「ゼロ番号」に移動しなければなりません。その後、もう一度左にリセットされます。

+1

0-1-0は必須ですか?私は0-.5-1や0-1-2をすることをお勧めします。 – ryeMoss

+0

コードでも、0から1までの値を持ち、0に戻すことが重要です。UIを使用する場合は、-1から0まで1にすることもできます。 – Question3r

+1

Time.time *(1/cycleDuration)が必要な場合は、操作の順序を強制するために、より多くの括弧を追加する必要があると思います。あるいは、あなたは* 1をすべて一緒に落とすことができます。以来、それはTime.time/cycleDurationと同じになるでしょう –

答えて

1

このアプローチを試すことができます。しかし、たとえばDuskから初期化する場合は、Initialize(float value, TimeMod mod)メソッドを呼び出すことを忘れないでください。

using System; 
using UnityEngine; 
using UnityEngine.UI; 

public class CycleBar : MonoBehaviour 
{ 
    [SerializeField] 
    private Image cycleBar; 

    private TimeMod currentMod = TimeMod.AM; 

    public void Initialize(float value, TimeMod mod) 
    { 
     currentMod = mod; 
     cycleBar.fillAmount = GetProgressbarValue(value); 
    } 

    public void UpdateValue(float value) 
    { 
     CheckTimeMod(value); 
     cycleBar.fillAmount = GetProgressbarValue(value); 
    } 

    private void CheckTimeMod(float value) 
    { 
     if (Mathf.Abs(value - 1) < 0.01f) 
     { 
      currentMod = TimeMod.PM; 
     } 

     if (Mathf.Abs(value) < 0.01f) 
     { 
      currentMod = TimeMod.AM; 
     } 
    } 

    private float GetProgressbarValue(float value) 
    { 
     switch (currentMod) 
     { 
      case TimeMod.AM: 
       return value/2; 
      case TimeMod.PM: 
       return 0.5f + Mathf.Abs(value-1)/2; 
      default: 
       throw new ArgumentOutOfRangeException("currentMod", currentMod, null); 
     } 
    } 

    public enum TimeMod 
    { 
     AM, 
     PM 
    } 
} 

とコントローラ:

using UnityEngine; 

public class Controller : MonoBehaviour 
{ 
    [SerializeField] 
    private CycleBar cycleBar; 

    private void Update() // TimeHandler 
    { 
     var value = Mathf.PingPong(Time.time, 1); // handle the time 
     cycleBar.UpdateValue(value); 
    } 
} 

しかし、それは可能、範囲[-1;1]でもっと簡単な方法を使用している場合。それがマークしてください、この記事のように正解、あなたを助けている場合たとえば、あなたはenter image description here

UnityEngine.UI

からスライダーを使用することができます。

0

UIで新しい画像を作成してから2Dリサイズモードで完全な状態にリサイズすることができます。コード内でXを0から1にスケールすることができます。

関連する問題