Unity入門

【Unity】Sliderの値取得とイベント処理のスクリプト制御

この記事について

この記事ではSliderの値取得とイベント処理をスクリプトで制御する方法について説明します。

この記事でわかること

  • slider.value で現在の値を取得できる
  • slider.onValueChanged.AddListener() で変更イベントを登録できる
  • ドラッグを離したタイミングは IPointerUpHandler を実装して検知可能

Sliderとは?

Sliderについては以下の記事を参考にしてください。

Sliderをスクリプトで制御

Sliderをスクリプトから参照する準備

ヒエラルキーで右クリックをしてSliderを用意します。
・「右クリック」→「UI」→「Slider」

次にスクリプトを作成してSliderにアタッチしてください。

値を取得する

testSlider.valueが現在の数値。minValue と maxValue の範囲内で動きます。

using TMPro;
using UnityEngine;
using UnityEngine.UI;

public class Slider_Script : MonoBehaviour
{
    [SerializeField] private Slider testSlider;
    private int i;
    private bool flag;

    void Start()
    {
        testSlider = this.GetComponentInChildren<Slider>();
        testSlider.value = 0;
        i=0;

        testSlider.maxValue = 100;  //最大数を100に設定
    }
    private void Update()
    {
        testSlider.value = i;
        
        if (i == 100){flag = true;}
        else if( i == 0){flag = false;}

        if (flag){i = i - 1;}
        else{i = i + 1;}
        
        Debug.Log(testSlider.value);
    }
}

実行してみると、Sliderの値がupdateで随時更新されていることがわかりますね。
※0.1や0.01のような小数でしてもいいですが予期せぬ誤差が出る可能性があるのであまりおすすめはしません。

onValueChanged + AddListenerでイベント処理

onValueChanged」を使用すればSliderを動かすたびに呼ばれます。リアルタイム調整(音量や感度)に便利!

using TMPro;
using UnityEngine;
using UnityEngine.UI;

public class Slider_Script : MonoBehaviour
{
    [SerializeField] private Slider testSlider;

    void Start()
    {
        testSlider = this.GetComponentInChildren<Slider>();
        testSlider.onValueChanged.AddListener(OnValueChanged);
    }
    private void OnValueChanged(float value)
    {
        Debug.Log("value: " + value);
    }
}

実行してみると、Updateを使用せずに値の取得が行えますね。

ドラッグを離した瞬間を検知する方法

Slider自体には「離した時」のイベントがないため、「IPointerUpHandler」を実装して拾います。

using TMPro;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;

public class Slider_Script : MonoBehaviour, IPointerUpHandler
{
    [SerializeField] private Slider testSlider;

    void Start()
    {
        testSlider = this.GetComponentInChildren<Slider>();
    }

    public void OnPointerUp(PointerEventData eventData)
    {
        Debug.Log("value: " + testSlider.value);
    }
}

実行してみると、離した瞬間に検知できます。updateみたいなずっと呼ぶ必要がなくなるので処理が軽くなりますね。

まとめ

  • slider.value → 現在の値を取得
  • onValueChanged.AddListener → 値が変わるたびに処理
  • IPointerUpHandler → ドラッグを離した瞬間を検知