我在使用 Unity 在 VR 中拖放对象时遇到问题

Posted

技术标签:

【中文标题】我在使用 Unity 在 VR 中拖放对象时遇到问题【英文标题】:I'm having a problem dragging and dropping an object in VR using Unity 【发布时间】:2021-08-09 21:04:55 【问题描述】:

我正在尝试拖放一个 3d 对象。我使用鼠标让它在编辑器中工作,但是每当我试图让它在 VR 中工作时,它会跟随相机而不是 LineRenderer。这是我的代码:

using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
using UnityEngine.XR.Interaction.Toolkit;
using UnityEngine.XR.Interaction.Toolkit.UI;

public class XRDragDrop : MonoBehaviour, IPointerDownHandler, IBeginDragHandler, IEndDragHandler, IDragHandler

    private Vector3 mOffset;
    private float mZCoord;
    [SerializeField]
    private LineRenderer leftLineRenderer;
    [SerializeField]
    private LineRenderer rightLineRenderer;
    
    public void OnDrag(PointerEventData eventData)
    
        transform.position = GetReticleWorldPos() + mOffset;
    

    public void OnPointerDown(PointerEventData eventData)
    
        Debug.Log(eventData.currentInputModule);
        mZCoord = Camera.main.WorldToScreenPoint(transform.position).z;
        mOffset = gameObject.transform.position - GetReticleWorldPos();
    
    private Vector3 GetReticleWorldPos()
    
        // Vector3 reticlePoint = rightLineRenderer.GetPosition(1);
        Vector3 reticlePoint = Input.mousePosition;
        reticlePoint.z = mZCoord;
        return Camera.main.ScreenToWorldPoint(reticlePoint);
    

    public void OnBeginDrag(PointerEventData eventData)
    
        Debug.Log("OnBeginDrag");
    

    public void OnEndDrag(PointerEventData eventData)
    
        Debug.Log("OnEndDrag");
    

我尝试使用注释掉的代码获取标线的位置,但它给出的结果与获取鼠标位置完全相同。有谁知道为什么对象会跟随相机而不是 LineRenderer?

【问题讨论】:

好吧,GetReticleWorldPos() 使用 Camera.main.ScreenToWorldPoint(reticlePoint),所以结果位置总是取决于 Camera.main 的位置和方向 啊,我明白了,您知道我将如何更改它以使其适用于 3d 环境吗?就像在编辑器中相机静止时一样,物体会很好地跟随物体,而在 vr 中,即使我试图保持相机静止,它也根本不会跟随它。 【参考方案1】:

结果我完全是个白痴,因为我能够使用 rightLineRenderer.GetPosition(1) 获得指针位置,我什至不需要使用 ScreenToWorldPoint 转换它,因为它已经是一个世界位置。但是,我设法以一种更简单的方式完成了我想做的事情,只使用 PointerEventData 需要更少的代码。这是我所做的:

using UnityEngine;
using UnityEngine.EventSystems;

public class XRDragDrop : MonoBehaviour, IPointerDownHandler, IDragHandler

    private Vector3 mOffset;
    
    public void OnDrag(PointerEventData eventData)
    
        transform.position = eventData.pointerCurrentRaycast.worldPosition + mOffset;
    

    public void OnPointerDown(PointerEventData eventData)
    
        mOffset = gameObject.transform.position - eventData.pointerCurrentRaycast.worldPosition;
    

【讨论】:

以上是关于我在使用 Unity 在 VR 中拖放对象时遇到问题的主要内容,如果未能解决你的问题,请参考以下文章

需要在icarousel中拖放视图

我正在使用selenium java在html5中拖放问题

在“ListView”中拖放

在 Windows 中拖放的通知

从库存中拖动2D图像并将其作为3d对象拖放

在嵌套数据表中拖放