つくるもの
スライダーをスライドしても、一定の値しか入らないようになっているよ!
基本の方針
- スライダーの値が変更されたときに呼ばれる関数:OnValueChanged を使う
- OnValueChangedで呼ばれたとき、スライダーの値を取得して、スライダーの値の範囲によってスライダーの値を変更する
基本知識
- スライダーの値は、
slider.value
で取得できる。slider関連のvalueはfloat値。 - UIを扱うため、
using UnityEngine.UI;
を追記する必要がある。 - UI関連のスクリプトは、
Hierarchy
にEventSystem
がないと動かない。 - スライダーの
Inspector
上のパラメータWhole Numbers
にチェックを入れると、整数値(int)しか入らなくなるので注意。
①:Sliderをつくろう!
Create > UIからSliderを探してSliderをつくろう!
②:Sliderにスクリプトを作ってアタッチしよう!
Sliderオブジェクトの中でなくても動作するよ。
using UnityEngine.UI;
を追記するのを忘れずに!
③:スクリプトの中身をつくろう!
▽サンプル1: スクロールバーの値を0.00
,0.25
,0.50
,0.75
,1.00
の5箇所にするスクリプト
SliderSample01.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class SliderSample01 : MonoBehaviour
{
// Start is called before the first frame update
[SerializeField] Slider slider; //スライダーのゲームオブジェクトをいれる
public void SliderChanged()
{
if (slider.value == 0) //スライダーの値がゼロのとき
{
slider.value = 0.0f; //スライダーの値をゼロにする
}
if (0.25f > slider.value && slider.value > 0.0f)
{
slider.value = 0.25f;
}
if (0.50f > slider.value && slider.value > 0.25f)
{
slider.value = 0.50f;
}
if (0.75f > slider.value && slider.value > 0.50f)
{
slider.value = 0.75f;
}
if (1.00f > slider.value && slider.value > 0.75f)
{
slider.value = 1.0f;
}
}
}
④:OnValueChangedを登録
Slider
のInspector
画面から、On Value Changed
を探そう!
+
ボタンを押す
None(Object)
にスクリプトの入っているオブジェクトをアタッチして、No Function
にスクリプトの関数(SliderChanged
)をアタッチ
→動かしてみよう!
応用:分割をもっと自由にできるようにしよう
方針:
-
分割したい数(sliderDivNum)
を変数で定義する - Sliderの
最大値(slider.maxValue)
、最小値(slider.minValue)
を取得する - 分割ひとつあたりの
分割量(divAmount)
を計算する(スライダーはこの値ごとに変わる) - 分割量にしたがってSliderの値を変える処理をする
作ってみた
SliderSnap_Generic.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class SliderSnap_Generic : MonoBehaviour
{
// Start is called before the first frame update
[SerializeField] Slider slider; //スライダーのゲームオブジェクトをいれる
[Header("スライダーを分割する数")] [SerializeField] int sliderDivNum; //スライダーを分割する数(分割数)
[Header("スライダーをゼロ位置にすることを許可")] [SerializeField] bool usingZero; //ゼロを使うか否か
[Header("スライダーの最大値")] [SerializeField] float maxvalue;
[Header("スライダーの最小値")] [SerializeField] float minvalue;
private float divAmount; //1分割あたり分割量
void Start()
{
slider.maxValue = maxvalue; //スライダーの最大値をmaxvalueにする
slider.minValue = minvalue; //スライダーの最小値をminvalueにする
divAmount = (maxvalue - minvalue) / (sliderDivNum - 1); //単位あたり分割量を定義
}
// Update is called once per frame
void Update()
{
}
public void SliderValueChanged()
{
for (int i = 0; i < sliderDivNum; i++)
{
if (i * divAmount >= slider.value && slider.value > (i-1) * divAmount)
{
slider.value = minvalue + i * divAmount;
}
}
if (slider.value == minvalue)
{
if (usingZero == false)
{
slider.value = minvalue + divAmount;
}
else
{
slider.value = minvalue;
}
}
}
}
パラメータのつけかた
注意! Whole Numbers
にチェックを入れないこと。
(float値を代入することが多いので、Sliderが正常に動かなくなります。)
使用例
おまけ:Unity自作スクリプトのInspectorビューでの見え方を変更
ヘッダーをつける方法