[Unity初心者向け][UI]一定の値しか入らないスライダーをつくろう！


## つくるもの
![gif004.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/701407/76b86e8c-6bc3-dead-0190-7dbc21b28c7f.gif)

スライダーをスライドしても、一定の値しか入らないようになっているよ！

## 基本の方針  
- スライダーの値が変更されたときに呼ばれる関数：**OnValueChanged** を使う
- OnValueChangedで呼ばれたとき、スライダーの値を取得して、スライダーの値の範囲によってスライダーの値を変更する

## 基本知識
- スライダーの値は、`slider.value`で取得できる。slider関連のvalueはfloat値。
- UIを扱うため、`using UnityEngine.UI;`を追記する必要がある。
- UI関連のスクリプトは、`Hierarchy`に`EventSystem`がないと動かない。
- スライダーの`Inspector`上のパラメータ`Whole Numbers`にチェックを入れると、整数値(int)しか入らなくなるので注意。



# ①：Sliderをつくろう！
Create > UIからSliderを探してSliderをつくろう！
![gif002.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/701407/a2e2f4b6-ff6d-32e4-584c-fdca92219219.gif)

# ②：Sliderにスクリプトを作ってアタッチしよう！
Sliderオブジェクトの中でなくても動作するよ。
`using UnityEngine.UI;`を追記するのを忘れずに！

# ③：スクリプトの中身をつくろう！

**▽サンプル1：** スクロールバーの値を`0.00`,`0.25`,`0.50`,`0.75`,`1.00`の5箇所にするスクリプト

```c#: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`を探そう！
![スクリーンショット 2021-04-24 17.51.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/701407/7440ddbe-4a01-fe4f-d703-28a66eda6279.png)
`+`ボタンを押す
![スクリーンショット 2021-04-24 19.29.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/701407/e5737019-0c1b-103c-1ef0-bdd50996c5e3.png)
`None(Object)`にスクリプトの入っているオブジェクトをアタッチして、`No Function`にスクリプトの関数(`SliderChanged`)をアタッチ

→動かしてみよう！

# 応用：分割をもっと自由にできるようにしよう
## 方針：
- `分割したい数(sliderDivNum)`を変数で定義する
- Sliderの`最大値(slider.maxValue)`、`最小値(slider.minValue)`を取得する
- 分割ひとつあたりの`分割量(divAmount)`を計算する（スライダーはこの値ごとに変わる）
- 分割量にしたがってSliderの値を変える処理をする  

## 作ってみた
```c#: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;
            }
        }
    }
}
```

## パラメータのつけかた
![gif003.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/701407/d6254c69-83f4-355f-ab75-490b0640c356.gif)
### 注意！　`Whole Numbers`にチェックを入れないこと。
（float値を代入することが多いので、Sliderが正常に動かなくなります。）

# 使用例
![gif005.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/701407/7c9695bb-1e5c-4280-70de-851c41f8effa.gif)





# おまけ：Unity自作スクリプトのInspectorビューでの見え方を変更
ヘッダーをつける方法

http://unity-xeion.seesaa.net/article/422307056.html