using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.EventSystems; using UnityEngine.UI; namespace HeavenStudio.Editor { // Thank you Unity forums! // https://forum.unity.com/threads/scroll-view-does-not-scroll-with-mousewheel-when-mouse-is-over-a-button-inside-the-scroll-view.848848/ public class ChiScrollRect : ScrollRect, IPointerEnterHandler, IPointerExitHandler { private static string mouseScrollWheelAxis = "Mouse ScrollWheel"; private bool swallowMouseWheelScrolls = true; private bool isMouseOver = false; public void OnPointerEnter(PointerEventData eventData) { isMouseOver = true; } public void OnPointerExit(PointerEventData eventData) { isMouseOver = false; } private void Update() { // Detect the mouse wheel and generate a scroll. This fixes the issue where Unity will prevent our ScrollRect // from receiving any mouse wheel messages if the mouse is over a raycast target (such as a button). if (isMouseOver && IsMouseWheelRolling()) { var delta = UnityEngine.Input.GetAxis(mouseScrollWheelAxis); PointerEventData pointerData = new PointerEventData(EventSystem.current); pointerData.scrollDelta = new Vector2(0f, delta * scrollSensitivity); swallowMouseWheelScrolls = false; OnScroll(pointerData); swallowMouseWheelScrolls = true; } } public override void OnScroll(PointerEventData data) { if (IsMouseWheelRolling() && swallowMouseWheelScrolls) { // Eat the scroll so that we don't get a double scroll when the mouse is over an image } else { base.OnScroll(data); } } private static bool IsMouseWheelRolling() { return UnityEngine.Input.GetAxis(mouseScrollWheelAxis) != 0; } } }