KENTEM TechBlog

建設業のDXを実現するKENTEMの技術ブログです。

【Unity】スクロール機能に簡易的なスライダーを搭載する方法

前回の記事ではuGUIのスクロール機能を拡張し、要素数が増減した時に幅などをソースコード上で計算するのではなくContent Size FitterやHorizontal Layout Groupの仕組みを説明しました。

スクロール機能は奥が深く、新卒で初めてUnityを扱った筆者にとって理解がしづらかった部分がたくさんあります。

本記事では前回の状態から簡易的なスライダー機能を搭載する方法について記載します。

下記では右方向のスライダー機能を紹介しますが、似た処理を行うことで左方向にも対応が可能です。

本記事の目標

前回作成したスクロール機能の右側に右矢印のボタンを配置しました。

このボタンを1回クリックすると要素1個分スクロールするようになります。

ボタンを押す前 ボタンを押した後

実装

下記に示すSampleButton.csをボタンにアタッチします。 _scrollRect_contentRectTransformにはそれぞれ下記を指定します。

using UnityEngine;
using UnityEngine.UI;

public class SampleButton : MonoBehaviour
{
    private Button _button;
    [SerializeField] private ScrollRect _scrollRect;
    [SerializeField] private RectTransform _contentRectTransform;

    private void Start()
    {
        _button = GetComponent<Button>();
        _button.onClick.AddListener(() => Slide());
    }
    private void OnDestroy() => _button.onClick.RemoveAllListeners();

    private void Slide()
    {
        Vector2 currentPos = _scrollRect.normalizedPosition;
        // スクロール範囲を制限していないと一時的に範囲外となり見た目が崩れるため
        // 0~1の範囲に収まるようにする
        currentPos.x = Mathf.Clamp(currentPos.x + CalcPerStep(), 0, 1);
        _scrollRect.normalizedPosition = currentPos;
    }

    private float CalcPerStep()
    {
        var contentWidth = _contentRectTransform.rect.width;

        var scrollRectTransform = _scrollRect.GetComponent<RectTransform>();
        var scrollHiddenWidth = contentWidth - scrollRectTransform.rect.width;

        var contentCount = _contentRectTransform.childCount;
        var hiddenCount = scrollHiddenWidth / contentWidth * contentCount;

        return 1 / hiddenCount;
    }
}


解説

主要なメソッドであるSlideCalcPerStepについて解説します。

Slideメソッド

現在の表示位置はnormalizedPositionという値で管理されています。

docs.unity3d.com

横スクロールの場合、現在の表示位置が左端の場合は0、右端の場合は1となります。

矢印を1回押すたびにnormalizedPositionが加算される値は全要素数と表示されている要素数によって決定されます。

いくつ加算すれば良いかを下記のCalcPerStepで求め、加算した値をnormalizedPositionの値に代入します。

CalcPerStepメソッド

この計算式は具体例を用いて考えると分かりやすいため数字を用いて説明します。

全要素が5個、表示されている要素が2個の場合は、非表示になっている3個について、ボタンを押すたびに1つずつ表示していけば良いことになります。

要素数が可変でも対応できるよう、Scroll ViewとContentのwidthを取得してから全要素数と非表示の要素数を計算し、スクロール量を求めます。

内容を簡単にするため本記事ではマージンの値は0で行いましたが、マージンを設ける場合はその分も加味した値を戻り値とする必要があります。

まとめ

このような仕組みで簡易的なスライダー機能を作成することができました。

スクロール機能は長押ししてスワイプするという操作がやりづらいと感じる方々が多いと聞いております。

スライダー機能は直感的で分かりやすく、TypeScript等フロントエンドの分野で採用されやすいと思われます。

類似機能をUnityで実装する際は参考にしてみてください。

おわりに

KENTEMでは、様々な拠点でエンジニアを大募集しています! 建設×ITにご興味頂いた方は、是非下記のリンクからご応募ください。 recruit.kentem.jp career.kentem.jp