C# Unity先增大值,然后减小值(日夜循环)

C# Unity先增大值,然后减小值(日夜循环),c#,unity3d,C#,Unity3d,我有一个循环,需要循环条,其值范围为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

我有一个循环,需要循环条,其值范围为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;//一天中的当前时间
私人浮动secondsPerDay=120;//每天最长时间
私有图像循环栏;//用户界面栏
私有void Start()
{
cycleBar=GetComponent();//引用
UpdateCycleBar();//更新ui
}
私有void更新()
{
currentTime+=Time.deltaTime;//增加时间
如果(currentTime>=secondsPerDay)//一天结束了?
currentTime=0;//重置时间
UpdateCycleBar();//更新ui
}
私有void UpdateCycleBar()
{
cycleBar.rectTransform.localScale=新向量3(currentTime/secondsPerDay,1,1);
}
}
但现在我想要的是上图中提到的行为。如何将
currentTime
从0增加到1,然后再恢复到0

问题是:我的循环条仍然应该从左向右增加


夜晚应该持续最长时间的40%,其他的20%。

如果您正在寻找将变量从
0
增加到
1
的方法,那么从
1
增加到
0
就是答案。有许多其他的方法可以做到这一点,但这是为像这样的任务

public float speed = 1.19f;

void Update()
{
    //PingPong between 0 and 1
    float time = Mathf.PingPong(Time.time * speed, 1);
    Debug.Log(time);
}
通过Mathf.Sin()函数执行此操作。但你必须得到它的绝对值。Mathf.abs(Mathf.sin()); 它将在0到1之间变化,然后返回到零。但它在零度时并不平滑

或在末尾将sin函数偏移+1乘以0.5f,使其再次回到1

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;
}

使用-1对1代替0对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
}

将值1指定给“图像”的末尾。我的意思是,不要把1作为一天的中间,把它作为你的夜晚的结束,就像图片上的那样,这将是午夜。然后当它达到1时,将时间设为0?只需添加一个标志,如果该标志为真,则增加计数,如果达到1,则将标志更改为假,然后开始将计数减少为0,此时,将标志更改为真,因此…以前没有注意到,但你是对的,就是这样。是的,这很好,但是你有关于UI问题的帮助吗?目前我使用此代码,但正如您所想象的,
currentTime
currentBarTime
不会同步运行。不确定这是最佳方式,因为这不仅是白天和黑夜,而且是黎明和黄昏,所以使用乒乓球会使黄昏出现在黎明之前。@FLX查看标题和问题的主体。“如何将currentTime从0增加到1,然后再返回到0?”这回答了在0和1之间返回的问题。没别的了。也许OP应该问一个不同的问题,但这100%回答了当前的问题。@Question3r您需要问一个关于UI问题的新问题。对不起,但是
(Mathf.Sin(timer)+1)*0.5f
不是一个有效的语法,请为您更改它,我认为您可以在某些方面这样做。尝试编辑过的代码。但周期将始终为0,因为计时器始终为0?我再次编辑此代码。顺便说一句,你可以为你的左右夜做些别的事情。因为我们在这些答案中有这样的代码,从0到1,然后再回到0,这意味着你从晚上回到黄昏,而不是从白天开始。如果你想知道什么时候重置变量
定时器
,我可以给你这个问题的另一个代码?因为它可能会比float.MaxValue更大。我不需要变量
速度
对吗?它不在某处使用。这个例子很有用,谢谢。如果您愿意,您可以向我展示您的另一个示例虽然这段代码可能有效,但最好解释这是一个解决方案的方式或原因。是的,这是可行的,但需要保持在0和1之间:/n您可以将计时器从0增加到120,然后除以120,当它超过1时,将其设置为0。。。