Time.deltaTimeで、ゲージが満タンになる秒数を指定してみました。
ゲージを作る
ゲージはUI.Imageオブジェクトで簡単に作りました。インスペクタでSource Imageに真っ白い画像をアタッチしています。
Fill Amountは0~1の値で、1でゲージが満タンになります。
ゲージの上がる速さ
UpdateメソッドでfillAmountに一定の値を加算代入していくと、1フレームごとにゲージが上がる量を指定したことになります。
例えば、0.01を足していくと、100フレームでゲージが満タンになります。
using UnityEngine;
using UnityEngine.UI;
public class GaugeSpeed : MonoBehaviour
{
[SerializeField] Image gauge; // ゲージ
[SerializeField] Text timeText;
[SerializeField] Text gaugeText;
int f // フレーム数;
// Start is called before the first frame update
void Start()
{
// ゲージを0にする
gauge.fillAmount = 0f;
timeText.text = "";
gaugeText.text = "";
}
// Update is called once per frame
void Update()
{
if (f <= 100)
{
// ゲージに0.01を足していく
gauge.fillAmount += 0.01f;
// ゲージ量と時間を表示
gaugeText.text = gauge.fillAmount.ToString();
timeText.text = f.ToString();
f++;
}
}
}
ゲージに足す値にTime.deltaTimeをかけると、1フレームごとでなく、1秒ごとのゲージが上がる量、つまりゲージが上がる速度を指定できます。
ゲージの量 = 速さ × 時間
これは、小学校で習う「距離」「速さ」「時間」の関係を求める公式と同じです。
ゲージが満タンになる時間をコントロールする
例えば、8秒でゲージを満タンにしたいときの速さの値は、上の式で簡単に求められます。
1(満タンのとき) = 速さ × 8秒
速さ = 1 / 8 = 0.125
この値を使うと8秒でゲージがちょうど満タンになりました。
using UnityEngine;
using UnityEngine.UI;
public class GaugeSpeed : MonoBehaviour
{
[SerializeField] Image gauge;
[SerializeField] Text timeText;
[SerializeField] Text gaugeText;
float second; // 秒数
// Start is called before the first frame update
void Start()
{
gauge.fillAmount = 0f;
timeText.text = "";
gaugeText.text = "";
}
// Update is called once per frame
void Update()
{
if (second <= 8)
{
// ゲージを毎秒0.125増やす
gauge.fillAmount += 0.125f * Time.deltaTime;
// ゲージ量を表示
gaugeText.text = gauge.fillAmount.ToString();
// 秒数をカウント
second += Time.deltaTime;
// 秒数を表示
timeText.text = second + "秒";
}
}
}
角度で使う
オブジェクトが回転する速さも同じように設定できます。8秒で1回転してほしいときは、回転する速度を45(= 360 / 8)にします。
using UnityEngine;
using UnityEngine.UI;
public class GaugeSpeed : MonoBehaviour
{
// 猿の頭
[SerializeField] Transform suzanne;
[SerializeField] Text timeText;
[SerializeField] Text gaugeText;
float second;
// Start is called before the first frame update
void Start()
{
timeText.text = "";
gaugeText.text = "";
}
// Update is called once per frame
void Update()
{
if (second <= 8)
{
// 今の角度を取得
Vector3 angle = suzanne.eulerAngles;
// Y軸を毎秒45度回転
angle.y += 45f * Time.deltaTime;
// 回転した角度を適用
suzanne.eulerAngles = angle;
gaugeText.text = suzanne.eulerAngles.y.ToString();
second += Time.deltaTime;
timeText.text = second + "秒";
}
}
}