如何使ScrollRect内容无限滚动?

时间:2017-07-25 13:59:24

标签: c# user-interface unity3d

我目前正在开展一个小型项目,以学习Unity,并且我坚持做一个无限滚动的ScrollRect。我想到了从面具中产生/回收对象,添加正确的动作并注册,并根据内容面板的移动方向将新的设置为内容面板的最后一个或第一个兄弟,但是那里是一个小问题。当我在该内容面板上有100多个对象时,我不能期望将内容面板设置得很长,以便我可以将其滚动很长时间。我需要的是滚动一个小的(比掩模大)面板无限量。我该怎么办?

我目前正在玩normalizedPosition,并且回滚到面板的顶部(或者根据我前进的方向向下),这就是我的OnDrag方法的样子;

public void OnDrag(PointerEventData eventData)
{
    if (transform.GetComponent<ScrollRect>().verticalNormalizedPosition < 0.15f)
    {
        transform.GetComponent<ScrollRect>().verticalNormalizedPosition = 0.88f;
    }
    if (transform.GetComponent<ScrollRect>().verticalNormalizedPosition > 0.90f)
    {
        transform.GetComponent<ScrollRect>().verticalNormalizedPosition = 0.17f;
    }
}

顺便说一下,如果需要任何相关信息,我的班级正在实施IDragHandler。

1 个答案:

答案 0 :(得分:0)

在回顾了我在互联网上发现的一些例子后,我决定制作内容面板移动类型&#34; Unrestricted&#34;,从而使面板滚动到我想要的位置。我手动放置按钮,内容的孩子。这里和那里都存在一些小的数学问题,当调整高度时,新的按钮形成了某种奇怪的效果,但是,我仍然实现了无限的滚动效果。

public void OnDrag(PointerEventData eventData)
{
    _yMargin = ScrollContent.transform.position.y - _dragStart;
    Debug.Log(_yMargin);
    //todo: howmanybuttons shows how many lines should be filled. Take sign to determine way, take number to determine line no.
    int howManyLevels = Mathf.Abs((int)(_yMargin / _buttonHeight) / 2);
    Debug.Log(howManyLevels);
    if (Mathf.Sign(_yMargin).Equals(1))
    {
        for (int i = 0; i < howManyLevels; i++)
        {
            _dragStart += _buttonHeight;
            _upCount += 2;
            PanObjectPoolManager.Recycle(ScrollContent.transform.GetChild(0));
            PanObjectPoolManager.Recycle(ScrollContent.transform.GetChild(0));
            _button = PanObjectPoolManager.Spawn(ButtonObject, ScrollContent.transform);
            _button.transform.GetChild(0).GetComponent<Text>().text = _downCount + "";
            BuildOnCoords(_downlevel, true);
            if (_downCount == 99)
                _downCount = -1;
            _downCount++;
            _button = PanObjectPoolManager.Spawn(ButtonObject, ScrollContent.transform);
            _button.transform.GetChild(0).GetComponent<Text>().text = _downCount + "";
            BuildOnCoords(_downlevel, false);
            if (_downCount > 99)
                _downCount = 0;
            _downCount++;
            _downlevel++;
            _uplevel++;
        }
    }
    if (Mathf.Sign(_yMargin).Equals(-1))
    {
        for (int i = 0; i < howManyLevels; i++)
        {
            _dragStart -= _buttonHeight;
            _downCount -= 2;
            PanObjectPoolManager.Recycle(ScrollContent.transform.GetChild(_childCount - 2));
            PanObjectPoolManager.Recycle(ScrollContent.transform.GetChild(_childCount - 2));
                _button = PanObjectPoolManager.Spawn(ButtonObject, ScrollContent.transform);
            _button.transform.GetChild(0).GetComponent<Text>().text = _upCount + "";
            _button.transform.SetSiblingIndex(0);
            BuildOnCoords(_uplevel, false);
            if (_upCount < 0)
                _upCount = 99;
            _upCount--;
            _button = PanObjectPoolManager.Spawn(ButtonObject, ScrollContent.transform);
            _button.transform.GetChild(0).GetComponent<Text>().text = _upCount + "";
            _button.transform.SetSiblingIndex(0);
            BuildOnCoords(_uplevel, true);
            if (_upCount == 0)
                _upCount = 100;
            _upCount--;
            _uplevel--;
            _downlevel--;
        }
    }
}