我在使用 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 中拖放对象时遇到问题的主要内容,如果未能解决你的问题,请参考以下文章