2017-07-25 122 views
0

我目前正在研究一個小型項目來學習Unity,並且我被困在做無限滾動的ScrollRect。根據內容面板的移動方向,我得到了從面具中產生/回收對象並添加正確的動作和註冊,並將新的設置爲內容面板的最後一個或第一個兄弟的想法,但是在那裏是一個小問題。當我在該內容面板上有超過100個對象時,我不能期望讓內容面板很長,這樣我就可以長時間滾動它。我需要的是滾動一個小的(比面具更大的面板)無限量的面板。我該怎麼做?如何使ScrollRect內容無限滾動?

我目前正在玩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,順便說一句,如果需要有關的任何信息。

+0

如果你真的很快滾動並從垂直位置0.89到0.99怎麼辦?你不應該把它困在0.17,你應該增加或減少一個值。 – Draco18s

+0

我不滾動,而只是讓它拖動工作。我已經實現了IScrollHandler來「吞噬」那個動作。在拖動時,我不明白「增加」的意思,但是我會嘗試在0.99時將垂直標準化位置增加0.02,並希望它能夠回滾。 –

回答

0

在回顧了我在互聯網上發現的一些例子之後,我決定讓內容面板的移動類型爲「無限制」,從而讓面板按照我的意願滾動​​。我正在手動放置按鈕,內容的孩子。這裏和那裏都有一些小的數學問題,並且在調整高度時,新按鈕形成了某種奇怪的現象,但仍然實現了無限的滾動效果。

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--; 
     } 
    } 
}