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 方法。
这样就可以使用事件并且滚动矩形不会移动。
如果您以前没有使用过它,请按照以下步骤操作:
在您的 Canvas 中创建一个空的 GameObject 来填充
space 您的用户应在何处做出手势。
创建一个继承自 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
的新脚本
一个脚本示例可以是这个
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");
}
}
将此脚本添加到您在 Canvas 中创建的空游戏对象中,如果您是从 Monobehaviour 继承的,那么您还应该添加一个图形组件,例如图像或文本。
如果你想让用户能够在整个屏幕上拖动旋转而不是滚动矩形,那么让空游戏object填满你所有的canvas并设置它作为你的 canvas 的第一个 child,然后放在 ScrollRect
下面。在 Unity UI 中,canvas 的最后一个 child 是在它上面的 object,所以这样你的 ScrollRect
就会在你的空上方GameObject 并在拖动时捕获拖动事件。
应该就可以了,如果你是复制粘贴我的脚本,一定要把movingObject变量设置成你要旋转的object
我正在我的游戏对象上实现一个拖动脚本,以便用户可以通过触摸屏幕来旋转它们,我还有一个水平滚动矩形,其中包含用户可以选择显示相应对象的按钮,发生的事情是当用户滑动手指旋转对象时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 方法。
这样就可以使用事件并且滚动矩形不会移动。
如果您以前没有使用过它,请按照以下步骤操作:
在您的 Canvas 中创建一个空的 GameObject 来填充 space 您的用户应在何处做出手势。
创建一个继承自 UnityEngine.UI.Graphic (or add a graphic component to it like an
Image
orText
, in that case inherit fromMonobehaviour
as usual) and uses the interfaces that you are interested in, In your case I think they are, IBeginDragHandler, IDragHandler and IEndDragHandler 的新脚本
一个脚本示例可以是这个
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");
}
}
将此脚本添加到您在 Canvas 中创建的空游戏对象中,如果您是从 Monobehaviour 继承的,那么您还应该添加一个图形组件,例如图像或文本。
如果你想让用户能够在整个屏幕上拖动旋转而不是滚动矩形,那么让空游戏object填满你所有的canvas并设置它作为你的 canvas 的第一个 child,然后放在
ScrollRect
下面。在 Unity UI 中,canvas 的最后一个 child 是在它上面的 object,所以这样你的ScrollRect
就会在你的空上方GameObject 并在拖动时捕获拖动事件。应该就可以了,如果你是复制粘贴我的脚本,一定要把movingObject变量设置成你要旋转的object