Unity输入系统拖动后具有偏移



我是新Unity输入系统的新手,并实现了拖动算法。它应该在点击鼠标时使用&拖曳拖动操作将移动cimemachine摄影机Target,因此摄影机将跟随。它正在工作,但问题是:拖动后有一点偏移。因此,在屏幕上拖动不是1:1拖动cameraTarget。你知道为什么会这样吗?

这是我的代码:

public class DragManager : MonoBehaviour
{
private InputControls.MouseActions mouseActions;
private Coroutine _coroutine;
private CameraHandler cameraHandler;
private Vector3 _pointerStartPosition;
private Vector3 _pointerCurrentPosition;
private void OnEnable()
{
cameraHandler = CameraHandler.Instance;
mouseActions.Enable();
mouseActions.Drag.started += Drag_started;
mouseActions.Drag.canceled += Drag_canceled;
}
private void OnDisable()
{
mouseActions.Drag.started -= Drag_started;
mouseActions.Drag.canceled -= Drag_canceled;
mouseActions.Disable();
}
private void Awake()
{
mouseActions = new InputControls().Mouse;
}
private void Drag_started(InputAction.CallbackContext obj)
{
_pointerStartPosition = mouseActions.MousePosition.ReadValue<Vector2>();
_coroutine = StartCoroutine(HandleDragCoroutine());
}
private void Drag_canceled(InputAction.CallbackContext obj)
{
StopCoroutine(_coroutine);
}

private IEnumerator HandleDragCoroutine()
{
while (true)
{
_pointerCurrentPosition = mouseActions.MousePosition.ReadValue<Vector2>();
var dragIteration = _pointerStartPosition - _pointerCurrentPosition; // drag _pointerCurrentPosition to _pointerStartPosition
var cameraTargetTransform = cameraHandler.GetCameraTargetTransform();
cameraTargetTransform.position += delta * Time.deltaTime;
_pointerStartPosition = _pointerCurrentPosition;
yield return null; // wait for new frame Update
}
}
}

它在统一中很常见,我经历了这段时间的

试试这个:

public static Vector2 TouchToScreenPoint(RectTransform draggingCanvasRectTransform)
{
Vector2 position = Vector2.zero ;

if (Input.touchCount > 0)
{
// respect only first touch, mousePosition module will update on each finger touch the screen.
RectTransformUtility.ScreenPointToLocalPointInRectangle(draggingCanvasRectTransform, Input.touches[0].position,
Camera.main, out position);
}
}

这在任何屏幕大小上都有效,你可以参考你使用的任何相机和你使用的主画布。

希望这对你有用

所以几个小时后我找到了解决方案。以下是更新后的代码。

说明:

  • 我不得不重新计算鼠标在世界空间的位置(尽管它看起来是正确的(
  • 删除Time.deltaTime的乘法,因为这将导致最小的移动
  • 除此之外,我还在使用Cinemachine。在虚拟摄像头上,我必须将"软区高度/宽度"设置为零(0(。否则,拖动时相机会反弹
public class DragManager : MonoBehaviour
{
private InputControls.MouseActions mouseActions;
private InputControls.TouchActions touchActions;
private Coroutine _coroutine;
private CameraTarget cameraTarget;
private Camera _camera;
private Vector3 _pointerStartPosition;
private Vector3 _pointerCurrentPosition;
private void OnEnable()
{
cameraTarget = CameraTarget.Instance;
mouseActions.Enable();
mouseActions.Drag.started += Mouse_Drag_started;
mouseActions.Drag.canceled += Drag_canceled;
}
private void OnDisable()
{
mouseActions.Drag.started -= Mouse_Drag_started;
mouseActions.Drag.canceled -= Drag_canceled;
mouseActions.Disable();
}
private void Awake()
{
mouseActions = new InputControls().Mouse;
_camera = Camera.main;
}
private void Mouse_Drag_started(InputAction.CallbackContext obj)
{
_pointerStartPosition = CalculatePositionToWorldSpace(mouseActions.MousePosition.ReadValue<Vector2>());
_coroutine = StartCoroutine(HandleDragCoroutine(mouseActions.MousePosition));
}
private Vector3 CalculatePositionToWorldSpace(Vector3 _pointerPosition)
{
var worldDirection = _camera.ScreenToWorldPoint(_pointerPosition);
worldDirection.z = 0f;
return worldDirection - cameraTarget.Transform.position;
}
private void Drag_canceled(InputAction.CallbackContext obj)
{
if (_coroutine != null)
StopCoroutine(_coroutine);
}

private IEnumerator HandleDragCoroutine(InputAction pointerPositionInputAction)
{
while (true)
{
_pointerCurrentPosition = CalculatePositionToWorldSpace(pointerPositionInputAction.ReadValue<Vector2>());
var dragIteration = _pointerStartPosition - _pointerCurrentPosition; // drag _pointerCurrentPosition to _pointerStartPosition
cameraTarget.Transform.position += dragIteration;
_pointerStartPosition = _pointerCurrentPosition;
yield return null; // wait for new frame Update
}
}
}

最新更新