ScrollRect 干扰拖动对象

ScrollRect interferes with dragobject

我正在我的游戏对象上实现一个拖动脚本,以便用户可以通过触摸屏幕来旋转它们,我还有一个水平滚动矩形,其中包含用户可以选择显示相应对象的按钮,发生的事情是当用户滑动手指旋转对象时scrollrect是一起滚动的,如何防止旋转对象时scrollrect滚动?

拖动对象:

using UnityEngine;
using System.Collections;
public class DragObject : MonoBehaviour {
    private float m_RotationSpeed = 40f;
    void Start () {
    }

    void Update() {

        if (1 == Input.touchCount) {

            gameObject.transform.Rotate (Vector3.down, Input.touches [0].deltaPosition.x * m_RotationSpeed * Time.deltaTime);

            }
        }
}

滚动矩形:

您应该使用 UnityEngine.EventSystems 中的接口而不是使用 Update 方法。

这样就可以使用事件并且滚动矩形不会移动。

如果您以前没有使用过它,请按照以下步骤操作:

  1. 在您的 Canvas 中创建一个空的 GameObject 来填充 space 您的用户应在何处做出手势。

  2. 创建一个继承自 UnityEngine.UI.Graphic (or add a graphic component to it like an Image or Text, in that case inherit from Monobehaviour as usual) and uses the interfaces that you are interested in, In your case I think they are, IBeginDragHandler, IDragHandler and IEndDragHandler

  3. 的新脚本

一个脚本示例可以是这个

using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;

public class EventsExample : Graphic, IBeginDragHandler, IDragHandler, IEndDragHandler {

    public GameObject movingObject; // I AM ROTATIN IF YOU DRAG!!

    private float m_RotationSpeed = 1f;

    public void OnBeginDrag(PointerEventData eventData)
    {
        Debug.Log("START DRAGGING, I ONLY GET CALLED ONCE PER FINGER");
    }

    public void OnDrag(PointerEventData eventData)
    {
        Debug.Log("I AM DRAGGING AND I AM GETTING CALLED EACH FRAME PER FINGER");
        movingObject.transform.Rotate(Vector3.down, eventData.delta.x * m_RotationSpeed * Time.deltaTime);
    }

    public void OnEndDrag(PointerEventData eventData)
    {
        Debug.Log("I END DRAGGING AND I AM GETTING CALLED ONCE PER FINGER");
    }
}
  1. 将此脚本添加到您在 Canvas 中创建的空游戏对象中,如果您是从 Monobehaviour 继承的,那么您还应该添加一个图形组件,例如图像或文本。

  2. 如果你想让用户能够在整个屏幕上拖动旋转而不是滚动矩形,那么让空游戏object填满你所有的canvas并设置它作为你的 canvas 的第一个 child,然后放在 ScrollRect 下面。在 Unity UI 中,canvas 的最后一个 child 是在它上面的 object,所以这样你的 ScrollRect 就会在你的空上方GameObject 并在拖动时捕获拖动事件。

  3. 应该就可以了,如果你是复制粘贴我的脚本,一定要把movingObject变量设置成你要旋转的object