본문 바로가기
개발/Unity

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

by 테샤르 2020. 7. 1.

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

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

 

 

 

 

반응형

댓글