我有一个循环并想要循环条,其值范围从0到1并返回到0.
所以,目前我使用此代码
public class DayNightCycle : MonoBehaviour
{
private float currentTime = 0; // current time of the day
private float secondsPerDay = 120; // maximum time per day
private Image cycleBar; // ui bar
private void Start()
{
cycleBar = GetComponent<Image>(); // reference
UpdateCycleBar(); // update the ui
}
private void Update()
{
currentTime += Time.deltaTime; // increase the time
if (currentTime >= secondsPerDay) // day is over?
currentTime = 0; // reset time
UpdateCycleBar(); // update ui
}
private void UpdateCycleBar()
{
cycleBar.rectTransform.localScale = new Vector3(currentTime / secondsPerDay, 1, 1);
}
}
但现在我想要一个如上图所示的行为。如何将currentTime
从0增加到1然后再回到0?
问题:我的循环条仍然应该从左向右增加。
夜晚应该持续最长时间的40%,其他的则持续20%。
答案 0 :(得分:7)
如果您正在寻找一种方法将变量从0
增加到1
,然后从1
增加到0
,Mathf.PingPong
就是答案。还有很多其他方法可以做到这一点,但Mathf.PingPong
是针对像这样的任务。
public float speed = 1.19f;
void Update()
{
//PingPong between 0 and 1
float time = Mathf.PingPong(Time.time * speed, 1);
Debug.Log(time);
}
答案 1 :(得分:1)
通过Mathf.Sin()函数执行此操作。但你必须获得它的绝对价值。 Mathf.abs(mathf.sin()); 它将在0到1之间变化,然后变回零。但它并不是一成不变的。
或者将sin函数的最后+1乘以0.5f,使其再次回到一个。
float timer = 0;
float cycle = 0;
public float speed = 1;
void Update()
{
timer += Time.deltaTime;
Cycle();
}
void Cycle()
{
cycle = (Mathf.Sin(timer) + 1) * 0.5f;
}
答案 2 :(得分:1)
而不是0到1,使用-1到1.
定时器从-1开始,增加更新功能deltaTime,然后当它变得更多等于1时,它将被重置为-1。它是一个循环...
float timer = -1;
void Update()
{
timer += Time.deltaTime;
if(timer >= 1)
{
timer = -1;
}
Cycle();
}
void Cycle()
{
//Do Your Cycle
//-1 is left night, 0 is middle day, 1 is right night
}