2017-08-09 73 views
0

可视化从0与值范围内的图像条为1,并返回到0 I增加从0到1的值,并且因此,现在的值得到了它的逻辑减少它回0在Unity

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

您可以尝试这种方法。但是,如果您想从黄昏初始化它,请不要忘记调用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]。例如,如果它可以帮助你,马克请这个帖子作为正确答案,你可以使用滑块从UnityEngine.UI

enter image description here

0

您可以在UI中创建新图像,然后在2D调整大小模式下将其大小调整为完整状态。现在您可以在代码中将X从零扩展到1。