zoukankan      html  css  js  c++  java
  • Unity C# DragRigidbody.cs

        public class DragRigidbody : MonoBehaviour
        {
            const float k_Spring = 50.0f;
            const float k_Damper = 5.0f;
            const float k_Drag = 10.0f;
            const float k_AngularDrag = 5.0f;
            const float k_Distance = 0.2f;
            const bool k_AttachToCenterOfMass = false;
    
            private SpringJoint m_SpringJoint;
    
    
            private void Update()
            {
                // Make sure the user pressed the mouse down
                if (!Input.GetMouseButtonDown(0))
                {
                    return;
                }
    
                var mainCamera = FindCamera();
    
                // We need to actually hit an object
                RaycastHit hit = new RaycastHit();
                if (
                    !Physics.Raycast(mainCamera.ScreenPointToRay(Input.mousePosition).origin,
                                     mainCamera.ScreenPointToRay(Input.mousePosition).direction, out hit, 100,
                                     Physics.DefaultRaycastLayers))
                {
                    return;
                }
                // We need to hit a rigidbody that is not kinematic
                if (!hit.rigidbody || hit.rigidbody.isKinematic)
                {
                    return;
                }
    
                if (!m_SpringJoint)
                {
                    var go = new GameObject("Rigidbody dragger");
                    Rigidbody body = go.AddComponent<Rigidbody>();
                    m_SpringJoint = go.AddComponent<SpringJoint>();
                    body.isKinematic = true;
                }
    
                m_SpringJoint.transform.position = hit.point;
                m_SpringJoint.anchor = Vector3.zero;
    
                m_SpringJoint.spring = k_Spring;
                m_SpringJoint.damper = k_Damper;
                m_SpringJoint.maxDistance = k_Distance;
                m_SpringJoint.connectedBody = hit.rigidbody;
    
                StartCoroutine("DragObject", hit.distance);
            }
    
    
            private IEnumerator DragObject(float distance)
            {
                var oldDrag = m_SpringJoint.connectedBody.drag;
                var oldAngularDrag = m_SpringJoint.connectedBody.angularDrag;
                m_SpringJoint.connectedBody.drag = k_Drag;
                m_SpringJoint.connectedBody.angularDrag = k_AngularDrag;
                var mainCamera = FindCamera();
                while (Input.GetMouseButton(0))
                {
                    var ray = mainCamera.ScreenPointToRay(Input.mousePosition);
                    m_SpringJoint.transform.position = ray.GetPoint(distance);
                    yield return null;
                }
                if (m_SpringJoint.connectedBody)
                {
                    m_SpringJoint.connectedBody.drag = oldDrag;
                    m_SpringJoint.connectedBody.angularDrag = oldAngularDrag;
                    m_SpringJoint.connectedBody = null;
                }
            }
    
    
            private Camera FindCamera()
            {
                if (GetComponent<Camera>())
                {
                    return GetComponent<Camera>();
                }
    
                return Camera.main;
            }
        }
    
  • 相关阅读:
    diamond operator is not supported in -source 1.5
    ClassNotFoundException异常的解决方法
    serialVersionUID 的用途--转加自己的疑问
    java序列化---转
    junit类找不到的问题解决
    FastJson的基本用法----转
    sql字符串查找大小写敏感相关
    6.比较排序之快速排序
    有关ArrayList常用方法的源码解析
    5.比较排序之归并排序(非递归)
  • 原文地址:https://www.cnblogs.com/open-coder/p/15089224.html
Copyright © 2011-2022 走看看