代码之家  ›  专栏  ›  技术社区  ›  Daniel Lip

如何使用刚体和物理原理按住鼠标左键旋转对象?

  •  0
  • Daniel Lip  · 技术社区  · 2 年前

    这个脚本使其旋转,但也使对象远离,即使我停止旋转,对象也会继续远离。检查器中的转速设置为500。该对象具有附加的长方体碰撞器和刚体组件。

    我希望每次我按住鼠标并旋转鼠标移动鼠标时,它都能平稳地旋转,但对象会在不改变位置的情况下原地旋转。

    我还想知道,如果对象有刚体组件,那么它必须在FixedUpdate中旋转,或者我也可以在Update中使其旋转,在Update中它将没有物理?

    using UnityEngine;
    
    public class RotateDice : MonoBehaviour
    {
        public float rotateSpeed = 500.0f;
        public bool isRotating = true;
    
        private Rigidbody rb;
        private Quaternion targetRotation;
    
        void Start()
        {
            rb = GetComponent<Rigidbody>();
            targetRotation = transform.rotation; // Initialize to current rotation
        }
    
        void Update()
        {
            // Handle input in Update to be responsive
            if (isRotating && Input.GetMouseButton(0))
            {
                float xRotation = Input.GetAxis("Mouse X") * rotateSpeed * Time.deltaTime;
                float yRotation = -Input.GetAxis("Mouse Y") * rotateSpeed * Time.deltaTime;
    
                Quaternion xQuaternion = Quaternion.AngleAxis(xRotation, Vector3.up);
                Quaternion yQuaternion = Quaternion.AngleAxis(yRotation, Vector3.right);
    
                targetRotation *= xQuaternion * yQuaternion;
            }
        }
    
        void FixedUpdate()
        {
            // Perform rotation in FixedUpdate
            if (rb != null)
            {
                rb.MoveRotation(targetRotation);
            }
        }
    }
    

    检查器设置。

    inspector settings of the object to rotate

    1 回复  |  直到 2 年前
        1
  •  0
  •   Daniel Lip    2 年前

    这正按预期工作。

    using UnityEngine;
    
    public class RotateDice : MonoBehaviour
    {
        public float torque = 50.0f;
        public Rigidbody rb;
        public bool isRotating = true;
    
        void Start()
        {
            rb = GetComponent<Rigidbody>();
        }
    
        void OnMouseDrag()
        {
            if ((isRotating))
            {
                rb.AddTorque(Vector3.up * torque * -Input.GetAxis("Mouse X"));
                rb.AddTorque(Vector3.right * torque * Input.GetAxis("Mouse Y"));
            }
        }
    }