Unity Cách kéo vật cứng bằng con trỏ chuột

Để kéo Rigidbody bằng con trỏ chuột, chúng ta cần create một tập lệnh sẽ được gắn vào Camera và phát hiện xem có bất kỳ Rigidbody nào được nhấp vào hay không, nếu vậy, nó sẽ khởi tạo chuyển động kéo.

Sharp Coder Trình phát 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;
    }
}

Cài đặt

  • Đính kèm tập lệnh SC_DragRigidbody vào bất kỳ Máy ảnh nào
  • Đặt các Đối tượng bạn muốn kéo ở phía trước Máy ảnh (Đảm bảo các đối tượng bạn định kéo có gắn thành phần Rigidbody).

Bây giờ bạn có thể kéo Rigidbody bằng con trỏ chuột!

Bài viết được đề xuất
Làm việc với Thành phần Rigidbody của Unity
Triển khai Móc vật lộn 2D trong Unity
Cách phát hiện va chạm bằng mã trong Unity
Triển khai Vật lý trong các trò chơi được tạo ra trong Unity
Thêm vật lý bóng nảy trong Unity
Tạo trò chơi đua xe dựa trên vật lý trong Unity
Vật lý đằng sau Raycasting trong Unity