본문 바로가기
개발/Unity

Unity) 스크롤뷰 커스텀(가로, 세로 동시)

by 테샤르 2020. 7. 1.

스크롤 뷰 커스텀(가로, 세로 동시)

Unity에서 스크롤 뷰를 처리를 하다 보면  가로 스크롤도 되고 세로 스크롤도 되어야 하는 상황이 생긴다.

두 개 동시에 처리하기에는 까다롭다.

반응형

구글링 결과 커스텀 스크립트와 사용방법을 포스팅한다.

영상은 다음과 같다.

 

코드의 원리는 다음과같다.

하위 아이템으로 추가된 스크롤 뷰의 이벤트를 상위 스크롤 뷰에 이벤트를 다시 돌려주는 방식이다.

 

using UnityEngine;
using System.Collections;
using UnityEngine.UI;
using System;
using UnityEngine.EventSystems;
 
public class ScrollRectEx : ScrollRect {
 
    private bool routeToParent = false;
 
 
    /// <summary>
    /// Do action for all parents
    /// </summary>
    private void DoForParents<T>(Action<T> action) where T:IEventSystemHandler
    {
        Transform parent = transform.parent;
        while(parent != null) {
            foreach(var component in parent.GetComponents<Component>()) {
                if(component is T)
                    action((T)(IEventSystemHandler)component);
            }
            parent = parent.parent;
        }
    }
 
    /// <summary>
    /// Always route initialize potential drag event to parents
    /// </summary>
    public override void OnInitializePotentialDrag (PointerEventData eventData)
    {
        DoForParents<IInitializePotentialDragHandler>((parent) => { parent.OnInitializePotentialDrag(eventData); });
        base.OnInitializePotentialDrag (eventData);
    }
 
    /// <summary>
    /// Drag event
    /// </summary>
    public override void OnDrag (UnityEngine.EventSystems.PointerEventData eventData)
    {
        if(routeToParent)
            DoForParents<IDragHandler>((parent) => { parent.OnDrag(eventData); });
        else
            base.OnDrag (eventData);
    }
 
    /// <summary>
    /// Begin drag event
    /// </summary>
    public override void OnBeginDrag (UnityEngine.EventSystems.PointerEventData eventData)
    {
        if(!horizontal && Math.Abs (eventData.delta.x) > Math.Abs (eventData.delta.y))
            routeToParent = true;
        else if(!vertical && Math.Abs (eventData.delta.x) < Math.Abs (eventData.delta.y))
            routeToParent = true;
        else
            routeToParent = false;
 
        if(routeToParent)
            DoForParents<IBeginDragHandler>((parent) => { parent.OnBeginDrag(eventData); });
        else
            base.OnBeginDrag (eventData);
    }
 
    /// <summary>
    /// End drag event
    /// </summary>
    public override void OnEndDrag (UnityEngine.EventSystems.PointerEventData eventData)
    {
        if(routeToParent)
            DoForParents<IEndDragHandler>((parent) => { parent.OnEndDrag(eventData); });
        else
            base.OnEndDrag (eventData);
        routeToParent = false;
    }
}

 

ScrollExTest.unitypackage
0.02MB

 

 

 

 

반응형

댓글