Firstborn/Assets/RPG Creation Kit/Scripts/UI/ScrollRectPosition.cs

55 lines
2.5 KiB
C#
Raw Permalink Normal View History

using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;
using System.Collections;
public class ScrollRectPosition : MonoBehaviour
{
RectTransform scrollRectTransform;
RectTransform contentPanel;
RectTransform selectedRectTransform;
GameObject lastSelected;
void Start()
{
scrollRectTransform = GetComponent<RectTransform>();
contentPanel = GetComponent<ScrollRect>().content;
}
void Update()
{
// Get the currently selected UI element from the event system.
GameObject selected = EventSystem.current.currentSelectedGameObject;
// Return if there are none.
if (selected == null)
{
return;
}
// Return if the selected game object is the same as it was last frame,
// meaning we haven't moved.
if (selected == lastSelected)
{
return;
}
// Get the rect tranform for the selected game object.
selectedRectTransform = selected.GetComponent<RectTransform>();
// The position of the selected UI element is the absolute anchor position,
// ie. the local position within the scroll rect + its height if we're
// scrolling down. If we're scrolling up it's just the absolute anchor position.
float selectedPositionY = Mathf.Abs(selectedRectTransform.anchoredPosition.y) + selectedRectTransform.rect.height;
// The upper bound of the scroll view is the anchor position of the content we're scrolling.
float scrollViewMinY = contentPanel.anchoredPosition.y;
// The lower bound is the anchor position + the height of the scroll rect.
float scrollViewMaxY = contentPanel.anchoredPosition.y + scrollRectTransform.rect.height;
// If the selected position is below the current lower bound of the scroll view we scroll down.
if (selectedPositionY > scrollViewMaxY)
{
float newY = selectedPositionY - scrollRectTransform.rect.height;
contentPanel.anchoredPosition = new Vector2(contentPanel.anchoredPosition.x, newY);
}
// If the selected position is above the current upper bound of the scroll view we scroll up.
else if (Mathf.Abs(selectedRectTransform.anchoredPosition.y) < scrollViewMinY)
{
contentPanel.anchoredPosition = new Vector2(contentPanel.anchoredPosition.x, Mathf.Abs(selectedRectTransform.anchoredPosition.y));
}
lastSelected = selected;
}
}