【Unity】Time.deltaTimeでゲージが上がる速さをコントロールする

投稿者: | 2021-06-23

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 + "秒";

        }
    }
}

一人称ステルスホラーゲームをitch.ioで公開しました。

https://www.ame-name.com/archives/13822

コメントを残す

メールアドレスが公開されることはありません。