Unity Cum să trageți Rigidbody folosind cursorul mouse-ului

Pentru a trage Rigidbodies ​​cu cursorul mouse-ului trebuie să creăm un script care va fi atașat la o cameră și să detectăm dacă s-a făcut clic pe vreun Rigidbody, dacă da, va inițializa mișcarea de tragere.

Sharp Coder Video player

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

Înființat

  • Atașați scriptul SC_DragRigidbody la orice cameră
  • Plasați obiectele pe care doriți să le trageți în fața camerei (asigurați-vă că obiectele pe care intenționați să le trageți au atașată o componentă Rigidbody).

Acum puteți trage Rigidbodies cu cursorul mouse-ului!

Articole sugerate
Lucrul cu componenta Rigidbody a Unity
Cum să detectați coliziunile folosind codul în Unity
Cum să verificați dacă un jucător Rigidbody este împământat în Unity
Crearea unui joc de curse bazat pe fizică în Unity
Crearea unei simulări de steag în Unity
Adăugarea Bouncing Ball Physics în Unity
Implementarea unui grappling 2D în Unity