Unity Como arrastar Rigidbody usando o cursor do mouse

Para arrastar Rigidbodies ​​com o cursor do mouse precisamos criar um script que será anexado a uma Câmera e detectar se algum Rigidbody foi clicado, se sim, inicializará o movimento de arrastar.

Sharp Coder Reprodutor de vídeo

SC_DragRigidbody.cs

using UnityEngine;

public class SC_DragRigidbody : MonoBehaviour
{
    public float forceAmount = 500;

    Rigidbody selectedRigidbody;
    Camera targetCamera;
    Vector3 originalScreenTargetPosition;
    Vector3 originalRigidbodyPos;
    float selectionDistance;

    // Start is called before the first frame update
    void Start()
    {
        targetCamera = GetComponent<Camera>();
    }

    void Update()
    {
        if (!targetCamera)
            return;

        if (Input.GetMouseButtonDown(0))
        {
            //Check if we are hovering over Rigidbody, if so, select it
            selectedRigidbody = GetRigidbodyFromMouseClick();
        }
        if (Input.GetMouseButtonUp(0) && selectedRigidbody)
        {
            //Release selected Rigidbody if there any
            selectedRigidbody = null;
        }
    }

    void FixedUpdate()
    {
        if (selectedRigidbody)
        {
            Vector3 mousePositionOffset = targetCamera.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, selectionDistance)) - originalScreenTargetPosition;
            selectedRigidbody.velocity = (originalRigidbodyPos + mousePositionOffset - selectedRigidbody.transform.position) * forceAmount * Time.deltaTime;
        }
    }

    Rigidbody GetRigidbodyFromMouseClick()
    {
        RaycastHit hitInfo = new RaycastHit();
        Ray ray = targetCamera.ScreenPointToRay(Input.mousePosition);
        bool hit = Physics.Raycast(ray, out hitInfo);
        if (hit)
        {
            if (hitInfo.collider.gameObject.GetComponent<Rigidbody>())
            {
                selectionDistance = Vector3.Distance(ray.origin, hitInfo.point);
                originalScreenTargetPosition = targetCamera.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, selectionDistance));
                originalRigidbodyPos = hitInfo.collider.transform.position;
                return hitInfo.collider.gameObject.GetComponent<Rigidbody>();
            }
        }

        return null;
    }
}

Configurar

  • Anexe o script SC_DragRigidbody a qualquer câmera
  • Coloque os objetos que você deseja arrastar na frente da câmera (certifique-se de que os objetos que você pretende arrastar tenham um componente Rigidbody anexado).

Agora você pode arrastar Rigidbodies com o cursor do mouse!

Artigos sugeridos
Trabalhando com o componente Rigidbody do Unity
Como verificar se um jogador Rigidbody está fundamentado na unidade
Como detectar colisões usando código no Unity
Criando um jogo de corrida baseado em física no Unity
Criando uma simulação de bandeira no Unity
Adicionando física de bola quicando no Unity
Implementando um gancho 2D no Unity