Увеличение (зум/zoom) колесиком контента ScrollRect

Графический интерфейс пользователя

Увеличение (зум/zoom) колесиком контента ScrollRect

Сообщение eonyanov 10 июн 2016, 15:53

Хочу поделиться своим скриптом. Заодно может быть кто-нибудь даст совет, как улучшить.

Итак. Имеется ScrollRect, имеется карта, которая является контентом для ScrollRect.
Необходимо было сделать зум этой карты колесиком в то место, куда указывает мышь.

Настройки ScrollRect:
Horizontal/Vertical - вкл.
MovementType = Clamped
Inertia - выкл.
Scroll Sensitivity = 0;

Синтаксис:
Используется csharp
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.Events;
using UnityEngine.EventSystems;

[RequireComponent(typeof(ScrollRect))]
public class ResizeOnMouseWheel : MonoBehaviour, IPointerEnterHandler, IPointerExitHandler
{
        [SerializeField] private float startSize = 1f;
        [SerializeField] private float minSize = 1f;
        [SerializeField] private float maxSize = 2f;
        [SerializeField] private float smooth = 5f;
        [SerializeField] private float zoomStep = 1f;

        private ScrollRect scrollRect;
        private RectTransform thisRectTransform;
        private bool onObj = false;
        private float prevScale;
        private float targetScale = 1f;
        private Vector2 newCenter = Vector2.zero;

        void Start()
        {
                scrollRect = GetComponent<ScrollRect>();
                thisRectTransform = GetComponent<RectTransform>();
                targetScale *= startSize;
        }

        void Update()
        {
                float scrollWheel = Input.GetAxis("Mouse ScrollWheel"); // Обычно при кручении колесика вперед scrollWheel = 0.1

                if (onObj && scrollWheel != 0f)
                {
                        targetScale += zoomStep*scrollWheel;
                        targetScale = Mathf.Clamp(targetScale, minSize, maxSize);
                        RectTransformUtility.ScreenPointToLocalPointInRectangle(scrollRect.content, Input.mousePosition, Camera.main, out newCenter);
                        prevScale = scrollRect.content.localScale.x;
                }

                if(Mathf.Abs(scrollRect.content.localScale.x - targetScale) > 0.001)
                {
                        scrollRect.content.localScale = Vector3.Lerp(scrollRect.content.localScale, new Vector3(targetScale, targetScale, 1f), smooth*Time.deltaTime);
                        scrollRect.content.anchoredPosition = Vector2.Lerp(scrollRect.content.anchoredPosition, -1f * newCenter * scrollRect.content.localScale.x, smooth * Time.deltaTime);

                        var xDelta = scrollRect.content.rect.width/2 * scrollRect.content.localScale.x - thisRectTransform.rect.width/2;
                        var yDelta = scrollRect.content.rect.height/2 * scrollRect.content.localScale.y - thisRectTransform.rect.height/2;

                        scrollRect.content.anchoredPosition = new Vector2(
                                Mathf.Clamp(scrollRect.content.anchoredPosition.x, -xDelta, xDelta),
                                Mathf.Clamp(scrollRect.content.anchoredPosition.y, -yDelta, yDelta));
                }
        }

        public void OnPointerEnter(PointerEventData eventData)
        {
                onObj = true;
        }

        public void OnPointerExit(PointerEventData eventData)
        {
                onObj = false;
        }

        void OnDisable()
        {
                onObj = false;
        }
}
 
Glow Asteroids Game
Happy Chair
Аватара пользователя
eonyanov
UNITрон
 
Сообщения: 298
Зарегистрирован: 22 авг 2014, 10:28

Re: Увеличение (зум/zoom) колесиком контента ScrollRect

Сообщение Syberex 30 сен 2016, 02:55

Взял за основу ваш скрипт, переделал на события без апдейтов.

Необходимо было сделать зум этой карты колесиком в то место, куда указывает мышь.

Вот по моему именно это у меня не заработало, помучался, но переделал. Теперь работает как надо.

Синтаксис:
Используется csharp
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;

// viewtopic.php?f=115&t=38955
// Настройки ScrollRect:
// Horizontal/Vertical - вкл.
// MovementType = Clamped
// Inertia - выкл.
// Scroll Sensitivity = 0;
public class ResizeOnMouseWheel : MonoBehaviour, IScrollHandler
{
        public ScrollRect scrollRect;           // можно назначить в инспекторе

        [SerializeField]
        private float startSize = 1f;
        [SerializeField]
        private float minSize = 1f;
        [SerializeField]
        private float maxSize = 2f;
        [SerializeField]
        private float smooth = 5f;
        [SerializeField]
        private float zoomStep = 1f;
        private float targetScale = 1f;



        void Start()
        {
                if (scrollRect == null)
                        scrollRect = GetComponent<ScrollRect>();
                targetScale *= startSize;
        }


        public void OnScroll(PointerEventData eventData)
        {
                float scrollWheel = eventData.scrollDelta.y;
                Vector2 newCenter = Vector2.zero;
                Vector3 newCenterWorld = Vector2.zero;
                Rect rect = scrollRect.content.rect;

                targetScale += zoomStep * scrollWheel;
                targetScale = Mathf.Clamp(targetScale, minSize, maxSize);
               
                RectTransformUtility.ScreenPointToLocalPointInRectangle(scrollRect.content, eventData.position, eventData.pressEventCamera, out newCenter);
                RectTransformUtility.ScreenPointToWorldPointInRectangle(scrollRect.content, eventData.position, eventData.pressEventCamera, out newCenterWorld);
                Vector2 newPivot = new Vector2(newCenter.x / rect.width, newCenter.y / rect.height);
                scrollRect.content.pivot += newPivot;
                scrollRect.content.localScale = Vector3.Lerp(scrollRect.content.localScale, new Vector3(targetScale, targetScale, 1f), smooth * Time.deltaTime);
                scrollRect.content.position = newCenterWorld;
        }
}
 
Аватара пользователя
Syberex
Адепт
 
Сообщения: 2292
Зарегистрирован: 14 янв 2011, 20:35
Откуда: Кострома
  • Сайт

Re: Увеличение (зум/zoom) колесиком контента ScrollRect

Сообщение DanilaDIV 06 сен 2018, 11:24

А как переделать для андроида? Второй код не работает.
DanilaDIV
UNITрон
 
Сообщения: 247
Зарегистрирован: 06 май 2014, 12:10

Re: Увеличение (зум/zoom) колесиком контента ScrollRect

Сообщение Tolking 06 сен 2018, 14:11

Я правильно понял: тебе нужно на телефоне колесиком мыши скролить?
Ковчег построил любитель, профессионалы построили Титаник.
Аватара пользователя
Tolking
Адепт
 
Сообщения: 2714
Зарегистрирован: 08 июн 2009, 18:22
Откуда: Тула


Вернуться в uGUI

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2