using System; using System.Collections; using UnityEngine; namespace UnityStandardAssets.Utility { 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; } } }