protected virtual void Update() { if (!Application.isPlaying) { return; } if (markForRefresh) { RefreshContent(); markForRefresh = false; } // Calculate any smooth scrolling that needs to happen if (listInfo != null && listInfo.scrollToIndex != -1) { float itemSize = 0; listInfo.scrollTo = GetItemPosition(listInfo.scrollToIndex, out itemSize) + listInfo.scrollOffset; switch (listInfo.scrollAnchor) { case ListAnchor.Middle: listInfo.scrollTo -= (isVertical ? ViewportSize / 2f - itemSize / 2f : -ViewportSize / 2f + itemSize / 2f); break; case ListAnchor.End: listInfo.scrollTo -= (isVertical ? ViewportSize - itemSize : -ViewportSize + itemSize); break; } // Calculate the lerp using an ease out function double timePassed = SystemTimeInMilliseconds - listInfo.scrollingStart; float delta = (float)(timePassed / listInfo.scrollDelta); float distanceLeft = Mathf.Abs(listInfo.scrollTo - ViewportPosition); if (distanceLeft <= 0.5) { listInfo.ResetScroll(); } else { ContentPosition = ContentPosition - Mathf.Lerp(0, distanceLeft, delta) * (listInfo.scrollTo < ViewportPosition ? -1 : 1); UpdateListItems(); // Check if we have scrolled past the end of the content if (SpaceBelow < 0 || SpaceAbove < 0) { // Update the content position so its at the end ContentPosition = ContentPosition - (SpaceBelow < 0 ? SpaceBelow : -SpaceAbove); // Stop scrolling listInfo.ResetScroll(); // Do one last update UpdateListItems(); } } } }