Unity增加一个值然后减小它(DayNightCycle)

时间:2017-08-09 09:27:27

标签: c# unity3d

我有一个循环并想要循环条,其值范围从0到1并返回到0.

enter image description here

所以,目前我使用此代码

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%。

3 个答案:

答案 0 :(得分:7)

如果您正在寻找一种方法将变量从0增加到1,然后从1增加到0Mathf.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
}