스크롤 뷰 커스텀 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;
}
}
★☆☆☆☆
반응형
'개발 > Unity' 카테고리의 다른 글
Unity) 프로젝트가 확장될 때 코드 설계 방법 (8) | 2020.07.15 |
---|---|
Unity) Touch Event 2D / 3D 코드 처리 (1) | 2020.07.14 |
정리)Dev Weeks: 작업 효율을 높이기 위한 유니티 UI 제작 프로그래밍 패턴들 (2) | 2020.06.29 |
Unity) txt 파일 생성 및 저장(I/O) (0) | 2020.06.16 |
소식)Unity 2019 LTS (1) | 2020.06.14 |
댓글