このアプローチを試すことができます。しかし、たとえばDuskから初期化する場合は、Initialize(float value, TimeMod mod)
メソッドを呼び出すことを忘れないでください。
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
}
}
とコントローラ:
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);
}
}
しかし、それは可能、範囲[-1;1]
でもっと簡単な方法を使用している場合。それがマークしてください、この記事のように正解、あなたを助けている場合たとえば、あなたは![enter image description here](https://i.stack.imgur.com/IA2GO.png)
UnityEngine.UI
からスライダーを使用することができます。
0-1-0は必須ですか?私は0-.5-1や0-1-2をすることをお勧めします。 – ryeMoss
コードでも、0から1までの値を持ち、0に戻すことが重要です。UIを使用する場合は、-1から0まで1にすることもできます。 – Question3r
Time.time *(1/cycleDuration)が必要な場合は、操作の順序を強制するために、より多くの括弧を追加する必要があると思います。あるいは、あなたは* 1をすべて一緒に落とすことができます。以来、それはTime.time/cycleDurationと同じになるでしょう –