C# 可视化一个值范围为0到1并返回到0的图像栏
我将一个值从0增加到1,然后将其减少回0C# 可视化一个值范围为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
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);
}
}