GibTreaty

ScrollRectAutoScroll.cs

Jul 4th, 2019
139
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 6.79 KB | None | 0 0
  1. using System.Collections.Generic;
  2. using Rewired;
  3. using UnityEngine;
  4. using UnityEngine.EventSystems;
  5. using UnityEngine.UI;
  6.  
  7. public class ScrollRectAutoScroll : MonoBehaviour {
  8.  
  9.     public Bounds bounds;
  10.  
  11.     List<Selectable> selectables = new List<Selectable>();
  12.  
  13.     int elementCount;
  14.     RectTransform scrollRectTransform;
  15.  
  16.     public float distanceTop;
  17.     public float distanceBottom;
  18.  
  19.     #region Properties
  20.     Player RewiredPlayer { get; set; }
  21.  
  22.     ScrollRect ScrollRectComponent { get; set; }
  23.     #endregion
  24.  
  25.     void OnEnable() {
  26.         if(ScrollRectComponent) {
  27.             ScrollRectComponent.content.GetComponentsInChildren(selectables);
  28.             elementCount = selectables.Count;
  29.         }
  30.     }
  31.  
  32.     void Awake() {
  33.         RewiredPlayer = ReInput.players.GetPlayer(0);
  34.         ScrollRectComponent = GetComponent<ScrollRect>();
  35.         scrollRectTransform = ScrollRectComponent.transform as RectTransform;
  36.     }
  37.  
  38.     void Start() {
  39.         ScrollRectComponent.content.GetComponentsInChildren(selectables);
  40.         elementCount = selectables.Count;
  41.     }
  42.  
  43.     void Update() {
  44.         if(elementCount > 0) {
  45.             var contentRect = ScrollRectComponent.content.rect;
  46.             var selectedElement = EventSystem.current.currentSelectedGameObject ? EventSystem.current.currentSelectedGameObject.GetComponent<Selectable>() : null;
  47.  
  48.             DrawRect(contentRect, Color.yellow, ScrollRectComponent.content);
  49.  
  50.             if(selectedElement == null) return;
  51.  
  52.             var selectedTransform = selectedElement.transform as RectTransform;
  53.  
  54.             DrawRect2(selectedTransform, selectedTransform.rect, Color.yellow);
  55.  
  56.             if(RewiredPlayer.GetButtonDown("Menu Horizontal") || RewiredPlayer.GetNegativeButtonDown("Menu Horizontal") || RewiredPlayer.GetButtonDown("Menu Vertical") || RewiredPlayer.GetNegativeButtonDown("Menu Vertical")) {
  57.                 if(selectedElement.transform.IsChildOf(ScrollRectComponent.transform)) {
  58.                     ScrollTo(selectedElement);
  59.                 }
  60.             }
  61.  
  62.             void DrawRect(Rect rect, Color color, Transform parent) {
  63.                 rect.position = parent.TransformPoint(rect.position);
  64.                 rect.size = Vector2.Scale(scrollRectTransform.lossyScale, rect.size);
  65.  
  66.                 Debug.DrawLine(new Vector3(rect.xMin, rect.yMax, -.5f), new Vector3(rect.xMax, rect.yMax, -.5f), color);
  67.                 Debug.DrawLine(new Vector3(rect.xMax, rect.yMax, -.5f), new Vector3(rect.xMax, rect.yMin, -.5f), color);
  68.                 Debug.DrawLine(new Vector3(rect.xMax, rect.yMin, -.5f), new Vector3(rect.xMin, rect.yMin, -.5f), color);
  69.                 Debug.DrawLine(new Vector3(rect.xMin, rect.yMin, -.5f), new Vector3(rect.xMin, rect.yMax, -.5f), color);
  70.             }
  71.  
  72.             void DrawRect2(RectTransform original, Rect rect, Color color) {
  73.                 Vector3[] corners = new Vector3[4];
  74.  
  75.                 original.GetWorldCorners(corners);
  76.  
  77.                 float width = Mathf.Abs(corners[1].x - corners[2].x);
  78.                 float height = Mathf.Abs(corners[0].y - corners[1].y);
  79.  
  80.                 //Vector3 size = new Vector3(width, height, 1);
  81.                 //Vector3 position = new Vector3(corners[0].x, corners[0].y, corners[0].z);
  82.  
  83.                 Debug.DrawLine(corners[0], corners[1], color);
  84.                 Debug.DrawLine(corners[1], corners[2], color);
  85.                 Debug.DrawLine(corners[2], corners[3], color);
  86.                 Debug.DrawLine(corners[3], corners[0], color);
  87.  
  88.                 Vector3[] contentCorners = new Vector3[4];
  89.  
  90.                 ScrollRectComponent.content.GetWorldCorners(contentCorners);
  91.  
  92.                 //float contentWidth = Mathf.Abs(contentCorners[1].x - contentCorners[2].x);
  93.                 float contentHeight = Mathf.Abs(contentCorners[0].y - contentCorners[1].y);
  94.  
  95.                 float distanceFromTop = contentCorners[1].y - corners[1].y;
  96.                 float distanceFromBottom = corners[0].y - contentCorners[0].y;
  97.  
  98.                 float normalizedDistanceFromTop = distanceFromTop / contentHeight;
  99.                 float normalizedDistanceFromBottom = distanceFromBottom / contentHeight;
  100.  
  101.                 distanceTop = normalizedDistanceFromTop;
  102.                 distanceBottom = normalizedDistanceFromBottom;
  103.  
  104.                 Debug.DrawLine(contentCorners[0], contentCorners[1]);
  105.                 Debug.DrawRay(corners[1], new Vector3(0, distanceFromTop, 0), Color.magenta);
  106.                 Debug.DrawRay(corners[0], new Vector3(0, -distanceFromBottom, 0), Color.cyan);
  107.             }
  108.         }
  109.     }
  110.  
  111.     void ScrollTo(Selectable selectable) {
  112.         var rectTransform = selectable.transform as RectTransform;
  113.  
  114.         Vector3[] selectableCorners = new Vector3[4];
  115.         Vector3[] contentCorners = new Vector3[4];
  116.         Vector3[] viewportCorners = new Vector3[4];
  117.  
  118.         float verticalSliderPosition = ScrollRectComponent.verticalNormalizedPosition;
  119.  
  120.         rectTransform.GetWorldCorners(selectableCorners);
  121.         ScrollRectComponent.content.GetWorldCorners(contentCorners);
  122.         ScrollRectComponent.viewport.GetWorldCorners(viewportCorners);
  123.  
  124.         float selectableHeight = Mathf.Abs(selectableCorners[0].y - selectableCorners[1].y);
  125.         float contentHeight = Mathf.Abs(contentCorners[0].y - contentCorners[1].y);
  126.         float viewportHeight = Mathf.Abs(viewportCorners[0].y - viewportCorners[1].y);
  127.  
  128.         //switch(ScrollRectComponent.verticalScrollbar.direction) {
  129.         //    case Scrollbar.Direction.BottomToTop:
  130.         //        break;
  131.         //    case Scrollbar.Direction.TopToBottom:
  132.         //        break;
  133.         //}
  134.  
  135.         if(selectableCorners[0].y < viewportCorners[0].y) { // Bottom of selectable is under viewport
  136.             float distanceFromBottom = contentCorners[0].y - selectableCorners[0].y;
  137.             float distanceFromTop = contentCorners[1].y - selectableCorners[0].y;
  138.             //float normalizedPosition = distanceFromTop / (contentHeight - viewportHeight);
  139.             float normalizedPosition = (distanceFromTop - viewportHeight) / (contentHeight - viewportHeight);
  140.  
  141.             verticalSliderPosition = 1 - normalizedPosition;
  142.         }
  143.         else if(selectableCorners[1].y > viewportCorners[1].y) { // Top of selectable is over viewport
  144.             float distanceFromBottom = contentCorners[0].y - selectableCorners[1].y;
  145.             float distanceFromTop = contentCorners[1].y - selectableCorners[1].y;
  146.             float normalizedPosition = distanceFromTop / (contentHeight - viewportHeight);
  147.             //float normalizedPosition = (distanceFromTop - viewportHeight) / (contentHeight - viewportHeight);
  148.  
  149.             verticalSliderPosition = 1 - normalizedPosition;
  150.         }
  151.  
  152.         ScrollRectComponent.verticalNormalizedPosition = verticalSliderPosition;
  153.     }
  154. }
Advertisement
Add Comment
Please, Sign In to add comment