Unity Rigidbody slepen met de muiscursor

Om Rigidbodies ​​met de muiscursor te slepen, moeten we een een script maken dat aan een camera wordt gekoppeld en detecteren of er op een Rigidbody is geklikt. Als dat het geval is, wordt de sleepbeweging geïnitialiseerd.

Sharp Coder Video speler

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

Opgericht

  • Voeg het SC_DragRigidbody-script toe aan elke camera
  • Plaats ​​de objecten die u voor de camera wilt slepen (zorg ervoor dat aan de objecten die u wilt slepen een Rigidbody-component is gekoppeld).

Nu kun je Rigidbodies slepen met een muiscursor!

Voorgestelde artikelen
Werken met Unity's Rigidbody Component
Een op fysica gebaseerd racespel maken in Unity
Hoe u botsingen kunt detecteren met Code in Unity
Het implementeren van natuurkunde in games gemaakt in eenheid
C#-script voor het maken van een Rigidbody-magneet in Unity
Stuiterende balfysica in eenheid toevoegen
Implementatie van een 2D-grijphaak in Unity