【Unity】EnhancedScroller で思い通りのスクロールビューを作ろう

動作確認 Unity
動作確認

Unity の人気アセット EnhancedScroller でスクロールビューを作成します。

EnhancedScroller で思い通りのスクロールビューを作ろう

EnhancedScroller

Unity に Scroll View がありますが、EnhancedScroller を使用したほうが品質の良いスクロールビューが作れます。

チュートリアル

まずは、チュートリアルの手順を見ながらスクロールビューを作成しましょう。
チュートリアルのドキュメントは、Assets/EnhancedScroller v2/Tutorials フォルダに入っています。

チュートリアルのドキュメント
チュートリアルのドキュメント

新しいシーンを作成する

メニューから File -> New Scene をクリックします。
シーンのテンプレートは Basic でいいかと思います。

新しいシーンの作成
新しいシーンの作成

Camera がない場合は、ヒエラルキーに作成しておきましょう。
Camera コンポーネントの BackgroundType に Solid Color を設定して、Background を黒っぽくするといい感じになります。

Camera の設定
Camera の設定

Canvas を作成する

ヒエラルキーで右クリックして、UI -> Canvas をクリックします。
EventSystem も一緒に作成されます。

Canvas の作成
Canvas の作成

Canvas コンポーネントの RenderMode を Screen Space – Camera に設定します。
Canvas コンポーネントの RenderCamera にヒエラルキーの Camera を設定します。

Canvas の設定
Canvas の設定

CanvasScaler コンポーネントの UIScaleMode を Scale With Screen Size に設定します。
CanvasScaler コンポーネントの ReferenceResolution に X=1080 Y=1920 を設定します。
CanvasScaler コンポーネントの Match に 0.5 を設定します。

CanvasScaler の設定
CanvasScaler の設定

Scroller を作成する

ヒエラルキーで Canvas を選択しながら右クリックして、Create Empty をクリックします。
名前を Scroller に設定します。
RectTransform は Reset しておきます。(右上の点3個のところをクリックすると選択できます)

コンポーネントのReset
コンポーネントのReset

Scroller に EnhancedScroller コンポーネントを追加します。
ScrollRect コンポーネントも一緒に追加されます。

Scroller に Image コンポーネントを追加します。
CanvasRenderer コンポーネントも一緒に追加されます。

Scroller に Mask コンポーネントを追加します。

Scroller の RectTransform を調整して、Scroller の位置と大きさを適当に設定します。

Scrollerの作成
Scrollerの作成

Content を作成する

ヒエラルキーで Scroller を選択しながら右クリックして、Create Empty をクリックします。
名前を Content に設定します。
RectTransform は XYとも stretch に設定します。

Scroller の ScrollRect コンポーネントの Content に Content をドラッグ&ドロップして設定します。

Contentの作成
Contentの作成

TestScrollerController を作成する

ヒエラルキーで右クリックして、Create Empty をクリックします。
名前を TestScrollerController に設定します。
Transform は Reset しておきます。

TestScrollerControllerの作成
TestScrollerControllerの作成

スクリプト を作成する

Project ビューの Assets フォルダの下に Scripts フォルダを作成します。
Scripts フォルダを選択しながら右クリックし、Create -> C# Script をクリックします。
名前を TestScrollerCellView に設定します。
同様にして、TestScrollerController と TestScrollerData を作成します。

スクリプトの作成
スクリプトの作成

TestScrollerData のコードを書く

TestScrollerData はスクロールビューの1つのセルのデータを表します。

public class TestScrollerData {
    private string m_rAnimalName;

    public string ANIMAL_NAME { get { return m_rAnimalName; } }

    public TestScrollerData(string rAnimalName) {
        m_rAnimalName = rAnimalName;
    }
}

TestScrollerCellView のコードを書く

TestScrollerCellView はスクロールビューのセルビューにデータを反映します。

using EnhancedUI.EnhancedScroller;
using TMPro;
using UnityEngine;

public class TestScrollerCellView : EnhancedScrollerCellView {
    [SerializeField]
    private TextMeshProUGUI m_rTextMeshProUGUI;

    public void SetData(TestScrollerData rData) {
        m_rTextMeshProUGUI.SetText(rData.ANIMAL_NAME);
    }
}

TestScrollerController のコードを書く

TestScrollerController は、データとセルビューを紐づけます。
IEnhancedScrollerDelegate インターフェイスを継承して、必要なメソッドを実装します。

using EnhancedUI.EnhancedScroller;
using System.Collections.Generic;
using UnityEngine;

public class TestScrollerController : MonoBehaviour, IEnhancedScrollerDelegate {
    private List<TestScrollerData> m_arData;

    [SerializeField]
    private EnhancedScroller m_rScroller;
    [SerializeField]
    private TestScrollerCellView m_rCellViewPrefab;

    private void Start() {
        m_arData = new List<TestScrollerData>();
        m_arData.Add(new TestScrollerData("ライオン"));
        m_arData.Add(new TestScrollerData("クマ"));
        m_arData.Add(new TestScrollerData("鷹"));
        m_arData.Add(new TestScrollerData("イルカ"));
        m_arData.Add(new TestScrollerData("アリ"));
        m_arData.Add(new TestScrollerData("ネコ"));
        m_arData.Add(new TestScrollerData("ツバメ"));
        m_arData.Add(new TestScrollerData("犬"));
        m_arData.Add(new TestScrollerData("クモ"));
        m_arData.Add(new TestScrollerData("ゾウ"));
        m_arData.Add(new TestScrollerData("ハヤブサ"));
        m_arData.Add(new TestScrollerData("ネズミ"));

        m_rScroller.Delegate = this;
        m_rScroller.ReloadData();
    }

    #region IEnhancedScrollerDelegate
    public EnhancedScrollerCellView GetCellView(EnhancedScroller scroller, int dataIndex, int cellIndex) {
        TestScrollerCellView rCellView = scroller.GetCellView(m_rCellViewPrefab) as TestScrollerCellView;
        rCellView.SetData(m_arData[dataIndex]);
        return rCellView;
    }

    public float GetCellViewSize(EnhancedScroller scroller, int dataIndex) {
        return 100f;
    }

    public int GetNumberOfCells(EnhancedScroller scroller) {
        return m_arData.Count;
    }
    #endregion // IEnhancedScrollerDelegate.
}

TestScrollerCellView を作成する

ヒエラルキーで Content を選択しながら右クリックして、UI -> Panel をクリックします。
名前を TestScrollerCellView に設定します。
RectTransform は XYとも stretch に設定します。

TestScrollerCellView に TestScrollerCellView コンポーネントを追加します。
TestScrollerCellView の CellIdentifier に TestScrollerCellView を設定します。

TestScrollerCellViewの作成
TestScrollerCellViewの作成

Text を作成する

ヒエラルキーで TestScrollerCellView を選択しながら右クリックして、UI -> Text – TextMeshPro をクリックします。
名前を Text に設定します。
RectTransform は XYとも stretch に設定します。

TextMeshPro コンポーネントは、必要に応じて日本語フォントを設定します。

Textの作成
Textの作成

TestScrollerCellView の TestScrollerCellView コンポーネントの rTextMeshProUGUI に Text を設定します。

Textの設定
Textの設定

TestScrollerCellView プレハブを作成する

Projectビューの Assets フォルダの下に Prefabs フォルダを作成します。
ヒエラルキーから Prefabs フォルダに TestScrollerCellView をドラッグ&ドロップしてプレハブを作成します。

プレハブの作成
プレハブの作成

TestScrollerController コンポーネントを設定する

ヒエラルキーで TestScrollerController を選択します。
TestScrollerController に TestScrollerController コンポーネントを追加します。
TestScrollerController の rScroll に Scroller を設定します。
TestScrollerController の rCellViewPrefab に TestScrollerCellView プレハブを設定します。

TestScrollerControllerコンポーネントの設定
TestScrollerControllerコンポーネントの設定

動作確認する

Unity エディターを再生して、動作確認しましょう。

動作確認
動作確認

覚えておきたいポイント

RefreshActiveCellViews メソッド

現在表示されている CellView を更新します。
EnhancedScrollerCellView の RefreshCellView メソッドを override する必要があります。

ReloadData メソッド

スクロールビュー全体を作成し直します。
データの追加や削除があった場合に使用します。

NormalizedScrollPosition プロパティ

NormalizedScrollPosition プロパティは、現在のスクロール位置(0~1)を返します。

ReloadData メソッドの引数に渡すことにより、リロード後のスクロール位置を現在のままにできます。

scroller.ReloadData(scroller.NormalizedScrollPosition);

ScrollPosition プロパティにスクロール位置を設定することによりスクロール位置を変更できます。

scroller.ScrollPosition = scroller.NormalizedScrollPosition * scroller.ScrollSize;

JumpToDataIndex メソッド

何番目のデータを表示したいのかが分かれば、JumpToDataIndex メソッドでスクロール位置を変更できます。

scroller.JumpToDataIndex(nDataIndex);

まとめ

EnhancedScroller アセットを使用して、スクロールビューを作成しました。
セルビューを使いまわすことにより、軽量に動作します。
任意の場所までスクロールさせることが出来ます。
いろいろ触ってみて、思い通りのスクロールビューを作成できるようになりましょう。

コメント

タイトルとURLをコピーしました