На форуме Unity нашёл решение для ранее появившейся у меня проблемы, связанной с пересечение двух ScrollRect'ов(горизонтально и вертикально). Однако, сам что-то сообразить не могу, быть может, что-то делаю не так.
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;
}
}
Чуть выше мой проект, в котором у меня два скролла, которые на Page 2 пересекаются. При попадании тача на кнопки, срабатывает вертикальный скролл. Попадая на маленькую область между блоками этих кнопок, работает горизонтальный скролл. Приведенный выше скрипт, как я понял, решает эту проблему. Однако, его размещение на Page 2, как было указано на форуме, не помогает. (На Content Page 2 так же не работает)
Будьте добры, подскажите, пожалуйста, что не так. Наверняка, что-то упустил, что-то очень банальное :)
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Какие существуют виды рекламных бордов и как выбрать подходящий?
Пытаюсь в Unity3D с помощью компонента VideoPlayer отобразить видео по URL (с IP-камеры)При подключении требуется указать логин и пароль
Нужно предоставить WebApi доступ к UserManager<ApplicationUser> (AspNetCoreIdentity)
За один кадр триггер должны покидать несколько объектов и удаляться из пула, но OnTriggerExit отрабатывает один объект из десятка
Я написал парсер с использованием AngleSharpСайт для парсинга взят условно для теста