포함 객체

2019. 7. 26. 16:43무한 스크롤 뷰

생성에서 필요한 항목을 미리 생성한다고 했습니다. 먼저 이를 구현하는 방법에 대해서 알아보겠습니다.

포함 객체(UIEndlessView)

포함 객체는 스크롤의 설정과 스크롤의 알고리즘과 같은 정보들을 포함한 클래스입니다. 이 포함 객체는 다음과 같은 구성으로 이루어져 있습니다.

생성하기 위한 항목의 경로

경로에 해당되는 항목을 생성합니다.

항목의 가로 길이

가로, 세로 길이를 토대로 드래그를 하기 위한 최대 영역, 항목의 좌표, 현재 필드의 인덱스, 한 행의 최대 아이템 개수를 구하는데 사용됩니다.

항목의 세로 길이

스크롤을 하기 위한 알고리즘

스크롤 뷰의 드래그를 하기 위한 최대 영역, 항목의 좌표, 현재 행의 인덱스, 한 행의 최대 아이템 개수를 구하고 이를 토대로 항목을 갱신합니다.

뷰와 알고리즘에 필요한 토큰

무한 스크롤 뷰와 스크롤 뷰를 처리하는 알고리즘 사이에 파이프 역할을 하는 토큰을 주고 받습니다. 이 토큰을 통하여 초기화, 갱신 처리를 합니다.

구현

초기화

무한 스크롤 뷰를 초기화할 때 토큰, 스크롤 뷰 알고리즘, 스크롤을 드래그할 때 필요한 충돌체를 초기화합니다.

public void Initialize()
{
    if (mToken == null)
    {
        mToken = new EndlessToken(m_FieldPath, m_ItemPath, m_ItemWidth, m_ItemHeight);
    }
 
    if (mScrollView == null)
    {
        mScrollView = Find<UIEndlessScrollView>(transform);
    }
 
    mScrollView.Initialize(mToken);
 
    BoxCollider collider = Find<BoxCollider>(transform);
 
    if (collider != null)
    {
        collider.size = mScrollView.Panel.GetViewSize();
    }
}

활성화

초기화가 딱 한번만 호출되는 함수라면 Open은 특정 상황에서 재설정이 필요할 경우 호출되는 함수입니다. 탭을 이동하는 경우나 항목이 추가되거나 판매되었을 경우 호출해서 갱신해줘야합니다.

public void Open(int tapIndex, int itemCount)
{
    if (mScrollView != null)
    {
        mToken.Update(itemCount);
 
        mScrollView.Open(mToken);
    }
}

전체 코드

using UnityEngine;
 
public class UIEndlessView : MonoBehaviour
{
    public void Initialize()
    {
        if (mToken == null)
        {
            mToken = new EndlessToken(m_FieldPath, m_ItemPath, m_ItemWidth, m_ItemHeight);
        }
 
        if (mScrollView == null)
        {
            mScrollView = Find<UIEndlessScrollView>(transform);
        }
 
        mScrollView.Initialize(mToken);
 
        BoxCollider collider = Find<BoxCollider>(transform);
 
        if (collider != null)
        {
            collider.size = mScrollView.Panel.GetViewSize();
        }
    }
 
    public void Open(int tapIndex, int itemCount)
    {
        if (mScrollView != null)
        {
            mToken.Update(itemCount);
 
            mScrollView.Open(mToken);
        }
    }
 
    private T Find<T>(Transform parent)
    {
        return parent.GetComponentInChildren<T>();
    }
 
    [SerializeField] private string m_FieldPath;
    [SerializeField] private string m_ItemPath;
    [SerializeField] private int m_ItemWidth;
    [SerializeField] private int m_ItemHeight;
 
    private UIEndlessScrollView mScrollView;
    private EndlessToken mToken;
}

'무한 스크롤 뷰' 카테고리의 다른 글

스크롤 뷰  (0) 2019.07.26
항목  (0) 2019.07.26
토큰  (0) 2019.07.26
View  (0) 2019.07.25
개요  (0) 2019.07.25