【发布时间】:2017-06-13 07:56:55
【问题描述】:
我想在滚动视图的内容上实现拖放。
问题是当您尝试在滚动视图中拖动项目时,您无法滚动视图。
首先,我尝试通过IDragHandler、IBeginDragHandler、IEndDragHandle和IDropHandler接口实现拖放。乍一看,它工作得很好,但问题是你不能滚动 ScrollRect。
我认为问题是因为覆盖,当我使用与滚动矩形相同的事件触发器时,父级无法正常工作。
所以在那之后,我自己思考并通过IPointerDown,IPointerUp接口和ScrollRect中保持拖拽UI的特定时间来实现它,如果你没有在特定时间保持它,滚动效果很好。
但问题是通过启用我在 OnDrag、OnBeginDrag 和 OnEndDrag 函数之前编写的 DragHandler 脚本在保持时间结束时不起作用。
首先我想知道有什么方法可以调用这些函数?
二是有什么方法可以不使用拖拽界面实现拖拽UI?
拖动处理程序:
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);
}
}
【问题讨论】:
-
呃。拖放 UI 元素对于新 UI 来说是一个巨大的痛苦。这是不容易的一件事。我现在在这台计算机上没有使用它的项目,但基本上你为 每个 可拖动项目创建了一个零大小的滚动视图,并将“clamp”模式设置为“unbound”。然后这些滚动视图嵌入到锚点的父容器(可以是另一个滚动视图)中。每项滚动视图的内容对象的变换是用于定位的变换。 IIRC。如果您愿意,请查看github.com/Draco18s/IdleArtificer
-
嘿,我已经检查了链接并下载了项目,挖掘了它,但没有发现任何有用的和与滚动视图中的拖放相关的东西,我想我需要澄清一些事情,关于在滚动视图中拖放,我的意思是将项目从滚动视图拖到滚动视图之外的其他地方。关于你说的小费,我不认为它解决了我的问题。
-
对不起。我用完了字符。你需要下载它。打开主场景。在“游戏可见”区域的左侧,我保留了预制件的副本。寻找上面/旁边有箭头的那个。那个,当在游戏中被实例化时,是可拖动的。您需要检查转换层次结构(包括 RectTransform 枢轴和锚点)。它们由 CraftingManager.cs 实例化,第 210 行,而第 219 行控制它在屏幕上的放置位置。
-
嘿伙计,我在您的项目中使用了 BuildingGridItem 预制件。我将这些预制件添加到滚动视图中并测试拖放和滚动,但问题是当鼠标指针位于 BuildingGridItem 上时,滚动滚动视图与我的问题不同。
-
您可以拖动一个项目或您扫描滚动父滚动视图。你不能同时做这两件事,这是没有意义的。
标签: unity3d drag-and-drop scrollview eventtrigger scrollrect