对象在拖动时跳到中心
Object jumps to the center when dragging it
如何使用 IBeginDragHandler
并设置拖动位置以保持一致,而不是突然切换到游戏对象的中心?
这是我的简单代码,用于抓取和反对并在新位置释放它们。但是,我意识到通过角抓住对象 (2D) 会自动将指针设置为中心。就这样离开拖拖拉拉的感觉很寒酸。
using UnityEngine;
using System.Collections;
using UnityEngine.EventSystems;
public class Draggable : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDragHandler {
public void OnBeginDrag(PointerEventData eventData) {
Debug.Log ("Started dragging");
}
public void OnDrag(PointerEventData eventData) {
Debug.Log ("Currently dragging");
this.transform.position = eventData.position;
}
public void OnEndDrag(PointerEventData eventData) {
Debug.Log ("Ended dragging");
}
}
您需要使用偏移量。调用 OnPointerDown
时获取偏移量。在调用 OnDrag
时应用此偏移量。
对于 2D 精灵:
Camera mainCamera;
float zAxis = 0;
Vector3 clickOffset = Vector3.zero;
// Use this for initialization
void Start()
{
zAxis = transform.position.z;
}
public void OnPointerDown(PointerEventData eventData)
{
clickOffset = transform.position - mainCamera.ScreenToWorldPoint(new Vector3(eventData.position.x, eventData.position.y, zAxis));
}
public void OnDrag(PointerEventData eventData)
{
//Use Offset To Prevent Sprite from Jumping to where the finger is
Vector3 tempVec = mainCamera.ScreenToWorldPoint(eventData.position) + clickOffset;
tempVec.z = zAxis; //Make sure that the z zxis never change
transform.position = tempVec;
}
public void OnEndDrag(PointerEventData eventData)
{
}
对于UI对象,偏移量仍然是相同的解决方案,但也应该使用ScreenPointToLocalPointInRectangle
。
public class Draggable : MonoBehaviour, IDragHandler, IBeginDragHandler
{
public Canvas parentCanvas;
Vector3 Offset = Vector3.zero;
public void OnPointerDown(PointerEventData eventData)
{
Vector2 pos;
RectTransformUtility.ScreenPointToLocalPointInRectangle(parentCanvas.transform as RectTransform, eventData.position, parentCanvas.worldCamera, out pos);
Offset = transform.position - parentCanvas.transform.TransformPoint(pos);
}
public void OnDrag(PointerEventData eventData)
{
Vector2 movePos;
RectTransformUtility.ScreenPointToLocalPointInRectangle(parentCanvas.transform as RectTransform, eventData.position, parentCanvas.worldCamera, out movePos);
transform.position = parentCanvas.transform.TransformPoint(movePos) + Offset;
}
}
如何使用 IBeginDragHandler
并设置拖动位置以保持一致,而不是突然切换到游戏对象的中心?
这是我的简单代码,用于抓取和反对并在新位置释放它们。但是,我意识到通过角抓住对象 (2D) 会自动将指针设置为中心。就这样离开拖拖拉拉的感觉很寒酸。
using UnityEngine;
using System.Collections;
using UnityEngine.EventSystems;
public class Draggable : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDragHandler {
public void OnBeginDrag(PointerEventData eventData) {
Debug.Log ("Started dragging");
}
public void OnDrag(PointerEventData eventData) {
Debug.Log ("Currently dragging");
this.transform.position = eventData.position;
}
public void OnEndDrag(PointerEventData eventData) {
Debug.Log ("Ended dragging");
}
}
您需要使用偏移量。调用 OnPointerDown
时获取偏移量。在调用 OnDrag
时应用此偏移量。
对于 2D 精灵:
Camera mainCamera;
float zAxis = 0;
Vector3 clickOffset = Vector3.zero;
// Use this for initialization
void Start()
{
zAxis = transform.position.z;
}
public void OnPointerDown(PointerEventData eventData)
{
clickOffset = transform.position - mainCamera.ScreenToWorldPoint(new Vector3(eventData.position.x, eventData.position.y, zAxis));
}
public void OnDrag(PointerEventData eventData)
{
//Use Offset To Prevent Sprite from Jumping to where the finger is
Vector3 tempVec = mainCamera.ScreenToWorldPoint(eventData.position) + clickOffset;
tempVec.z = zAxis; //Make sure that the z zxis never change
transform.position = tempVec;
}
public void OnEndDrag(PointerEventData eventData)
{
}
对于UI对象,偏移量仍然是相同的解决方案,但也应该使用ScreenPointToLocalPointInRectangle
。
public class Draggable : MonoBehaviour, IDragHandler, IBeginDragHandler
{
public Canvas parentCanvas;
Vector3 Offset = Vector3.zero;
public void OnPointerDown(PointerEventData eventData)
{
Vector2 pos;
RectTransformUtility.ScreenPointToLocalPointInRectangle(parentCanvas.transform as RectTransform, eventData.position, parentCanvas.worldCamera, out pos);
Offset = transform.position - parentCanvas.transform.TransformPoint(pos);
}
public void OnDrag(PointerEventData eventData)
{
Vector2 movePos;
RectTransformUtility.ScreenPointToLocalPointInRectangle(parentCanvas.transform as RectTransform, eventData.position, parentCanvas.worldCamera, out movePos);
transform.position = parentCanvas.transform.TransformPoint(movePos) + Offset;
}
}