Unity Come trascinare il corpo rigido utilizzando il cursore del mouse

Per trascinare Rigidbodies ​​con il cursore del mouse dobbiamo creare uno script che verrà allegato a una fotocamera e rileverà se è stato cliccato un corpo rigido, in tal caso, inizializzerà il movimento di trascinamento.

Sharp Coder Lettore video

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;
    }
}

Impostare

  • Allega lo script SC_DragRigidbody a qualsiasi fotocamera
  • Posiziona gli oggetti che desideri trascinare davanti alla telecamera (assicurati che gli oggetti che intendi trascinare abbiano un componente Rigidbody collegato).

Ora puoi trascinare i corpi rigidi con il cursore del mouse!

Articoli suggeriti
Lavorare con il componente Rigidbody di Unity
Come verificare se un giocatore a corpo rigido è radicato in Unity
Come rilevare le collisioni utilizzando il codice in Unity
Aggiunta della fisica della palla rimbalzante in Unity
Creazione di un gioco di corse basato sulla fisica in Unity
Implementazione di un rampino 2D in Unity
Creazione di una simulazione di bandiera in Unity