본문 바로가기
Unity3D/Unity & C#

스크롤이 리스트가 가운데를 기점으로 움직이게 하기

by 캬캬백곰 2022. 3. 22.
728x90
GameObject prefab;
ScrollRect scrollRect;
RectTransform content;
RectTransform viewport;

List<GameObject> dataList = new List<GameObject>();

float defaultItemSize = 10;

int currentIndex = 0;

void Create()
{
	GameObject obj = Instantiate(prefab);
    dataList.Add(obj)
    obj.GetComponent<RectTransform>().SetParent(content);
    
    content.GetComponent<RectTransform>().sizeDelta += new Vector2(0, defaultItemSize);
}

void MoveTo()
{
	MoveTo(currentIndex);
}

void MoveTo(GameObject data)
{
	MoveTo(GetDataIndex(data));
}

void MoveTo(int index)
{
	if(IsValidDataIndex(index).Equals(true))
    {
    	Vector2 prevPosition = content.anchoredPosition;
        float move = 0.0f;

        move = GetMovePosition(index, viewport.rect.height, content.rect.height);
        content.anchoredPosition = new Vector2(prevPosition.x, move);
    }
}

int GetDataIndex(GameObject data)
{
    return dataList.FindIndex(p => p.Equals(data));
}

private bool IsValidDataIndex(int index)
{
    return (index >= 0 && index < dataList.Count) ? true : false;
}

private float GetMovePosition(int dataIndex, float viewportSize, float contentSize)
{
    float move = 0.0f;
    float moveItemSize = defaultItemSize;
    float passingItemSize = GetItemSizeSum(dataIndex);

    move = passingItemSize;

    move -= viewportSize * 0.5f - moveItemSize * 0.5f;

    move = Mathf.Clamp(move, 0.0f, contentSize - viewportSize);
    move = Mathf.Max(0.0f, move);

    return move;
}

private float GetItemSizeSum(int toIndex)
{
    return defaultItemSize * toIndex;
}
728x90
반응형