我正在我的游戏对象上实现一个拖动脚本,以便用户可以通过触摸屏幕旋转它们,我还有一个水平滚动条,其中包含用户可以选择显示相应对象的按钮,发生的是当用户滑动手指旋转对象滚动正在滚动对象,如何在旋转对象时阻止滚动滚动?
DragObject:
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);
}
}
}
scrollRect的:
答案 0 :(得分:1)
您应该使用UnityEngine.EventSystems中使用Update方法的接口。
这样就可以使用事件,而你的滚动矩形也不会移动。
如果您在执行此操作之前尚未使用它:
在Canvas中创建一个空的GameObject来填充 用户应该做出手势的空间。
创建一个继承自UnityEngine.UI.Graphic的新脚本(或向Image
或Text
添加图形组件,在这种情况下继承自Monobehaviour
像往常一样)并使用您感兴趣的界面,在您的情况下,我认为它们是,IBeginDragHandler,IDragHandler和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中创建的空GameObject中,如果您从Monobehaviour继承,那么您还应添加一个图形组件,如图像或文本。
如果您希望用户能够拖动以在整个屏幕中旋转但滚动,则将空的游戏对象填充所有画布并将其设置为画布的第一个子画面,然后放在ScrollRect
。在Unity UI中,画布的最后一个子节点就是它上面的对象,所以这样你的ScrollRect
将位于空的GameObject之上,并且在拖动它时会捕获拖动事件。
应该这样做,如果你复制粘贴我的脚本,请务必将movingObject变量设置为你想要旋转的对象。