Unity Як перетягнути тверде тіло за допомогою курсора миші

Щоб перетягнути Rigidbodies ​​курсором миші, нам потрібно створити сценарій, який буде приєднано до камери та визначити, чи було натиснуто якесь тверде тіло, якщо так, він ініціалізує перетягування.

Sharp Coder Відеоплеєр

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

Налаштування

  • Прикріпіть сценарій SC_DragRigidbody до будь-якої камери
  • Помістіть об’єкти, які ви хочете перетягнути, перед камерою (переконайтеся, що до об’єктів, які ви збираєтеся перетягнути, прикріплено компонент Rigidbody).

Тепер ви можете перетягувати тверді тіла курсором миші!

Рекомендовані статті
Робота з компонентом Rigidbody Unity
Як виявити зіткнення за допомогою коду в Unity
Додавання фізики стрибучого м’яча в Unity
Як перевірити, чи жорсткокорпусний гравець заснований на єдності
Фізика, що стоїть за Raycasting в Unity
Створення гоночної гри на основі фізики в Unity
Реалізація двовимірного захватного гака в Unity