C# 可视化一个值范围为0到1并返回到0的图像栏

C# 可视化一个值范围为0到1并返回到0的图像栏,c#,user-interface,unity3d,C#,User Interface,Unity3d,我将一个值从0增加到1,然后将其减少回0 private Image cycleBar; private float currentTime = 0; private float cycleDuration = 5; private void Start() { cycleBar = GetComponent<Image>(); UpdateCycleBar(); } private void Update() // TimeHandler { curre

我将一个值从0增加到1,然后将其减少回0

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
}
私有图像循环库;
专用浮点currentTime=0;
私人浮动周期比率=5;
私有void Start()
{
cycleBar=GetComponent();
UpdateCycleBar();
}
私有void Update()//TimeHandler
{
currentTime=Mathf.PingPong(Time.Time*1/cycleDuration,1);//处理时间
UpdateCycleBar();
}
私有void UpdateCycleBar()
{
//缺失的部分
}
所以现在这个值有了它的逻辑。我怎样才能像这个例子一样形象化它呢


当达到值1时,该条必须向右移动“零编号”。之后,它会再次在左侧重置。

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

您可以尝试这种方法。但如果您想从黄昏开始初始化,请不要忘记调用
Initialize(float value,TimeMod)
方法

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
    }
}
但如果可能的话,对范围
[-1;1]
使用更简单的方法。例如,您可以使用UnityEngine.UI中的滑块


如果这对你有帮助,请将这篇文章标记为正确答案。

你必须做0-1-0吗?我建议使用0-.5-1或0-1-2。根据代码,值从0到1再回到0是很重要的。在使用UI时,我也可以使用-1到0到1。我认为如果需要Time.Time*(1/cycleDuration),需要添加更多的括号来强制操作顺序。或者你可以把*1放在一起。因为这和Time.Time/cycleeduration是一样的,我将尝试一些可能的方法:)我在他之前的帖子中回答他。。。我已经不知道如何用乒乓球来处理这个问题了P
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);
    }
}