Я хочу реализовать перетаскивание содержимого прокрутки.
Проблема в том, что когда вы пытаетесь перетаскивать элементы в режиме прокрутки, вы не можете прокручивать вид.
Во-первых, я попытался реализовать перетаскивание с помощью интерфейсов IDragHandler, IBeginDragHandler, IEndDragHandle и IDropHandler. На первый взгляд, это работало довольно хорошо, но проблема заключалась в том, что вы не можете прокручивать ScrollRect.
Я думаю, что проблема связана с переопределением. Когда я использую триггеры событий, такие же, как прямоугольник прокрутки, например перетаскивание, родительский не работает должным образом.
Итак, после этого я подумал сам и реализовал его с помощью интерфейсов IPointerDown, IPointerUp и определенного времени для удержания перетаскиваемого пользовательского интерфейса в ScrollRect, и если вы не удерживаете его в определенное время, прокрутка работает хорошо.
Но проблема в том, что включение скрипта DragHandler, который я написал до того, как функции OnDrag, OnBeginDrag и OnEndDrag не работают, когда время удержания истекло.
Сначала я хочу знать, есть ли способ вызвать эти функции?
Во-вторых, есть ли способ реализовать пользовательский интерфейс перетаскивания без использования интерфейсов перетаскивания?
Перетаскивание:
using System;
using UnityEngine;
using UnityEngine.EventSystems;
public class DragHandler : MonoBehaviour, IDragHandler, IBeginDragHandler, IEndDragHandler
{
public static GameObject itemBeingDragged;
private Vector3 startPos;
private Transform startParent;
DragHandler dragHandler;
public void Awake()
{
dragHandler = GetComponent<DragHandler>();
}
public void OnBeginDrag(PointerEventData eventData)
{
Debug.Log("Begin");
itemBeingDragged = gameObject;
startPos = transform.position;
startParent = transform.parent;
}
public void OnDrag(PointerEventData eventData)
{
Debug.Log("Drag");
transform.position = Input.mousePosition;
}
public void OnEndDrag(PointerEventData eventData)
{
Debug.Log("End");
itemBeingDragged = null;
if (transform.parent == startParent)
{
dragHandler.enabled = false;
transform.SetParent(startParent);
transform.position = startPos;
}
}
}
Скроллректконтроллер:
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
public class ScrollRectController : MonoBehaviour, IPointerDownHandler, IPointerUpHandler
{
public float holdTime;
public float maxVelocity;
private Transform scrollRectParent;
private DragHandler dragHandler;
private ScrollRect scrollRect;
private float timer;
private bool isHolding;
void Awake()
{
scrollRectParent = GameObject.FindGameObjectWithTag("rec_dlg").transform;
dragHandler = GetComponent<DragHandler>();
dragHandler.enabled = false;
}
// Use this for initialization
void Start()
{
timer = holdTime;
}
// Update is called once per frame
void Update()
{
}
public void OnPointerDown(PointerEventData eventData)
{
Debug.Log("Down");
scrollRect = scrollRectParent.GetComponent<ScrollRect>();
isHolding = true;
StartCoroutine(Holding());
}
public void OnPointerUp(PointerEventData eventData)
{
Debug.Log("Up");
isHolding = false;
}
IEnumerator Holding()
{
while (timer > 0)
{
//if (scrollRect.velocity.x >= maxVelocity)
//{
// isHolding = false;
//}
if (!isHolding)
{
timer = holdTime;
yield break;
}
timer -= Time.deltaTime;
Debug.Log(timer);
yield return null;
}
dragHandler.enabled = true;
//dragHandler.OnBeginDrag();
}
}
Слот:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
public class Slot : MonoBehaviour, IDropHandler
{
public void OnDrop(PointerEventData eventData)
{
DragHandler.itemBeingDragged.transform.SetParent(transform);
}
}