您可以嘗試這種方法。但是,如果您想從黃昏初始化它,請不要忘記調用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
。
難道你需要做0-1-0嗎?我會建議做0-.5-1或0-1-2。 – ryeMoss
以及代碼,重要的是從0到1並返回0.當使用UI時,我可以使用-1到0到1。 – Question3r
如果你想要Time.time *(1/cycleDuration),我想你需要添加更多的括號來強制操作順序。或者你可以把* 1放在一起。因爲這將是相同的Time.time/cycleDuration –