O código a seguir funciona para clicar e arrastar um objeto:
private void MousePressed(InputAction.CallbackContext context)
{
Vector2 mousePosition = Input.mousePosition;
Vector3 worldPosition = mainCamera.ScreenToWorldPoint(new Vector3(mousePosition.x, mousePosition.y, -mainCamera.transform.position.z));
worldPosition.z = 0;
Collider2D hitCollider = Physics2D.OverlapPoint(worldPosition);
if (hitCollider != null)
{
StartCoroutine(DragUpdate(hitCollider.gameObject));
}
}
private IEnumerator DragUpdate(GameObject clickedObject)
{
float initialDistance = Vector3.Distance(clickedObject.transform.position, mainCamera.transform.position);
clickedObject.TryGetComponent<Rigidbody2D>(out var rb);
while (mouseClick.ReadValue<float>() != 0) {
Ray ray = mainCamera.ScreenPointToRay(Mouse.current.position.ReadValue());
if (rb != null) {
Vector3 direction = ray.GetPoint(initialDistance) - clickedObject.transform.position;
rb.velocity = direction * mouseDragPhysicsSpeed;
yield return waitForFixedUpdate;
} else {
clickedObject.transform.position = Vector2.SmoothDamp(clickedObject.transform.position, ray.GetPoint(initialDistance), ref velocity, mouseDragSpeed);
yield return null;
}
}
}
O problema é que o objeto primeiro se move de modo que seu centro fique no cursor. Como posso manter o deslocamento inicial para que o cursor permaneça no mesmo local relativo ao objeto como quando ele começou a arrastar?
Estou aberto a quaisquer outras sugestões para melhorar este código - sou novo em Unity/C#. Obrigado!
Para manter o deslocamento inicial do cursor em relação ao objeto durante o arrasto, basta fazer as seguintes alterações:
1- No MousePressed, capture o deslocamento inicial e passe para a corrotina:
2- Atualize a assinatura DragUpdate para aceitar o parâmetro offset:
3- Aplique o offset ao calcular targetPosition no DragUpdate:
Essas alterações manterão a posição inicial do cursor em relação ao objeto.