【Unity】SupperScrollViewで複数種類のセルを表示する

[UGUI Super ScrollView](https://assetstore.unity.com/packages/tools/gui/ugui-super-scrollview-86572
)

OnUpdateに切り替え処理を書いて、それをInitListView()のコールバックに登録します。

この記事で紹介するコード以外に、各CellViewのUIを更新するComponentと、元となるデータを扱うClassについて用意する必要があります（複雑すぎるため割愛）。


```BattleLogScrollHandler.cs
using System.Collections.Generic;
using SuperScrollView;
using System.Linq;
using UnityEngine;

[DisallowMultipleComponent]
public class BattleLogScrollHandler : MonoBehaviour
{
    [SerializeField] private LoopListView2 m_view = null;
    [SerializeField] private LogCellView _turnStartLogCell = null;
    [SerializeField] private LogCellView _commandLogCell = null;
    [SerializeField] private LogCellView _winLogCell = null;
    [SerializeField] private LogCellView _loseLogCell = null;
    [SerializeField] private LogCellView _levelUpLogCell = null;
    [SerializeField] private LogCellView _treasureLogCell = null;

    bool isInitialized = false;

    private LogHandler[] m_list;

    public void Open(IEnumable<LogHandler> logHandlers)
    {
        Debug.Log("BattleLogScrollHandler Open()");
        m_list = logHandlers.ToArray();

        // m_view.InitListView()は1度だけしか呼ばない
        if (!isInitialized)
        {
            m_view.InitListView(m_list.Length, OnUpdate);
            isInitialized = true;
        }
        else
        {
            // データ個数を変更して表示を更新する
            m_view.SetListItemCount(m_list.Length);
            m_view.RefreshAllShownItem();
        }
        // ScrollViewを非表示にしてる場合は表示するため
        m_view.gameObject.SetActive(true);
    }

    private LoopListViewItem2 OnUpdate(LoopListView2 view, int index)
    {
        if (index < 0 || m_list.Length <= index) return null;
        // Cellの元となるLogデータはLogHandlerを継承したクラスで管理している
        LogHandler data = m_list[index];
        var prevData = m_list.ElementAtOrDefault(index + 1);
        // UIの更新はLogCellViewを継承した各CellごとのComponentで行う
        LogCellView itemOriginal;
        switch (data.LogType)
        {
            case LogHandlerType.TurnStart:
                itemOriginal = _turnStartLogCell;
                break;
            case LogHandlerType.Command:
                itemOriginal = _commandLogCell;
                break;
            case LogHandlerType.Win:
                itemOriginal = _winLogCell;
                break;
            case LogHandlerType.Lose:
                itemOriginal = _loseLogCell;
                break;
            case LogHandlerType.TurnOver:
                itemOriginal = _loseLogCell;
                break;
            case LogHandlerType.LevelUp:
                itemOriginal = _levelUpLogCell;
                break;
            case LogHandlerType.Treasure:
                itemOriginal = _treasureLogCell;
                break;
            default:
                Debug.LogError("到達しないコードです");
                itemOriginal = null;
                break;
        }

        var itemObj = view.NewListViewItem(itemOriginal.name);
        var itemUI = itemObj.GetComponent<LogCellView>();

        itemUI.InitDisplay(data);

        return itemObj;
    }
}
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237014/947cb291-043a-c3a1-c173-8068360f669b.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237014/752adba3-b8da-f6c4-f647-8af25bb7d2a2.png)

異なる種類のセルを同じスクロールビューで扱うことができます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237014/139dd284-bb76-6397-2a0b-a044a8237ffc.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237014/c7c88840-631a-9d8e-6a48-a06257fc6036.png)


参考
[【Unity】【UGUI Super ScrollView】チャット画面を作る](http://baba-s.hatenablog.com/entry/2018/03/14/090000)